2017-02-22 7 views
1

В настоящее время я использую фрейм данных, в котором есть столбец списка типов (со строками) в каждой из его ячеек. Я заинтересован в применении value.counts() на нем, как если бы все списки были объединены в один огромный список (это было сделано, не очень хорошо работало)Применить .value_counts() в DataFrame со списками, заполненными в каждой ячейке

Пример иллюстрации структуры данных, которые у меня есть :

import pandas as pd 
df_list = pd.DataFrame({'listcol':[['a','b','c'],['a','b','c']]}) 
print df_list 
    listcol 
0 [a, b, c] 
1 [a, b, c] 

Я хотел бы применить на ней value.counts(), как это было бы, если бы это был большой concatinated список следующим образом:

#desired output: 
df=pd.DataFrame(['a','b','c','a','b','c']) 
df.columns = ['col'] 
df.col.value_counts() #desired output! 
b 2 
c 2 
a 2 

заранее спасибо!

ответ

1

Я думаю, вам нужно сначала создать сглаживаются list, а затем применить Counter, последние создают Series:

from itertools import chain 
from collections import Counter 

print (Counter(chain.from_iterable(df_list['listcol']))) 
Counter({'b': 2, 'a': 2, 'c': 2} 

s = pd.Series(Counter(chain.from_iterable(df_list['listcol']))) 
print (s) 
a 2 
b 2 
c 2 
dtype: int64 

Или создать Series и использовать value_counts:

#for python 2 omit list 
s = pd.Series(list(chain.from_iterable(df_list['listcol']))) 
print (s) 
0 a 
1 b 
2 c 
3 a 
4 b 
5 c 
dtype: object 

print (s.value_counts()) 
c 2 
a 2 
b 2 
dtype: int64 
+0

Спасибо, человек! точно, что я искал, не могли бы вы добавить к нему какую-то сортировку? :) –

+1

'value_counts' сортирует по умолчанию, для первого решения требуется' s = s.sort_values ​​() ' – jezrael

+1

или' s = s.sort_values ​​(по возрастанию = False) ';) – jezrael

Смежные вопросы