首页 > 解决方案 > pandas 中的二级聚合

问题描述

我有一个简单的例子:

DF = pd.DataFrame(
  {"F1" : ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C'],
   "F2" : [1, 2, 1, 2, 2, 3, 1, 2, 3, 2], 
   "F3" : ['xx', 'yy', 'zz', 'zz', 'zz', 'xx', 'yy', 'zz', 'zz', 'zz']}) 
DF

如何改进代码,以便在 F3-unique 列中,除了组中 F3 列的唯一值列表之外,这些值在组中的出现次数显示如下:

在此处输入图像描述

标签: pandaspandas-groupby

解决方案


似乎groupby aggregate's named aggregation + python'scollections.Counter在这里可以很好地工作:

from collections import Counter


df2 = DF.groupby('F1', as_index=False).aggregate({
    'F2': 'sum',
    'F3': lambda g: ' '.join([f'{k}-{v}' for k, v in Counter(g).items()])
})

df2

  F1  F2              F3
0  A   4  xx-1 yy-1 zz-1
1  B   7       zz-2 xx-1
2  C   8       yy-1 zz-3

聚合到 Counter 会根据唯一值的数量将集合转换为字典:

df2 = DF.groupby('F1', as_index=False).aggregate({
    'F2': 'sum',
    'F3': Counter
})
  F1  F2                           F3
0  A   4  {'xx': 1, 'yy': 1, 'zz': 1}
1  B   7           {'zz': 2, 'xx': 1}
2  C   8           {'yy': 1, 'zz': 3}

周围的理解用于重新格式化数据显示:

1行样本:

' '.join([f'{k}-{v}' for k, v in Counter({'xx': 1, 'yy': 1, 'zz': 1}).items()])
xx-1 yy-1 zz-1

推荐阅读