2017-02-09 12 views
2

У меня проблема с функцией в моем DataFrame. Это мой DataFrame (только функция, я хочу использовать):Pandas Split имеет кортежи

0  (a,1.0),(b,6.0),(c,10.0) 
1  (a,1.0),(b,6.0) 
2  (a,1.0),(x,6.0),(e,5) 

Я хотел бы создать функцию со строкой, которые имеют больший вес. Пример (после того, как сценарий), я хотел бы новую особенность:

0 c 
1 b 
2 x 

Можете ли вы мне помочь?

ответ

0

Я думаю, что вы можете использовать Counter и most_common, но мой формат ввода немного отличается - это list из tuples:

df = pd.DataFrame({'a':[[('a',1.0),('b',6.0),('c',10.0)], 
         [('a',1.0),('b',6.0) ], 
         [('a',1.0),('x',6.0),('e',5)]]}) 
print (df) 
           a 
0 [(a, 1.0), (b, 6.0), (c, 10.0)] 
1    [(a, 1.0), (b, 6.0)] 
2  [(a, 1.0), (x, 6.0), (e, 5)] 

print (df.a.apply(lambda x: Counter(dict(x)).most_common(1)[0][0])) 
0 c 
1 b 
2 x 
Name: a, dtype: object 

Это не было легко, и я должен спросить another question.

Понадобится:

import ast 

df = pd.DataFrame({'a':[['(a,1.0),(b,6.0),(c,10.0)']]}) 

print (df) 
          a 
0 [(a,1.0),(b,6.0),(c,10.0)] 

df.a = df.a.str[0].str.replace(r'\((\w+),', r"('\1',").apply(lambda x: ast.literal_eval(x)) 
print (df) 
           a 
0 ((a, 1.0), (b, 6.0), (c, 10.0)) 

print (df.a.apply(lambda x: Counter(dict(x)).most_common(1)[0][0])) 
0 c 
Name: a, dtype: object 
+0

Ok спасибо за ваш ответ. Мой df - это то же самое, что: 'df = pd.DataFrame ({'a': [['(a, 1.0), (b, 6.0), (c, 10.0)']]})' – Zop

+0

Phooo, it очень сложно. Основная проблема - это тот же разделитель ',' между 'tuples' и между' values' – jezrael

+0

Теперь мы меняем формат: 'df = pd.DataFrame ({'a': [['(a, 1.0) :(b, 6.0) :(c, 10.0) ']]}) ' – Zop