如何在pandas数据帧中对列表进行分组

时间:2017-05-16 10:44:40

标签: python python-2.7 pandas group-by

我有一个如下所示的数据框:

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()选项,我会收到错误

  

“不可用类型:'列表'。

如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您需要按照DataFrame构造函数展平列表,按stackvalue_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]