我有一个如下所示的数据框:
df = pd.DataFrame({'col1': [['a','b','c'], ['a','d'], ['c','c']]})
我想对数据帧进行分组,使它看起来像这样:
result = pd.DataFrame({'col1': [['a'], ['b'], ['c'], ['d']], 'count': [[2],[1],[3],[4]]})
如果我在python中使用pd.groupby('col1').count()
选项,我会收到错误
“不可用类型:'列表'。
如何解决这个问题?
答案 0 :(得分:2)
您需要按照DataFrame构造函数展平列表,按stack
和value_counts
创建Series
:
df1 = pd.DataFrame(df['col1'].values.tolist()).stack().value_counts().reset_index()
df1.columns = ['col1','count']
df1 = df1.sort_values('col1')
print (df1)
col1 count
1 a 2
2 b 1
0 c 3
3 d 1
如果确实需要列表(某些pandas功能可能失败),请添加applymap
:
df1 = df1.applymap(lambda x: [x])
print (df1)
col1 count
1 [a] [2]
2 [b] [1]
0 [c] [3]
3 [d] [1]
Counter
+ numpy.concatenate
的另一种解决方案:
from collections import Counter
df1 = pd.Series(Counter(np.concatenate(df['col1']))).reset_index()
df1.columns = ['col1','count']
df1 = df1.applymap(lambda x: [x])
print (df1)
col1 count
0 [a] [2]
1 [b] [1]
2 [c] [3]
3 [d] [1]