pandas - 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 列的唯一值列表之外,这些值在组中的出现次数显示如下:
解决方案
似乎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
推荐阅读
- vue.js - 如何在 URL 参数 vue js 中包含动态内容
- service - Anti-corruption Layer 层在分层架构中的位置在哪里?集成第三方服务
- javascript - 如何在通过 JavaScript 或 jQuery 加载页面时删除 URL 中的某些单词
- r - 使用函数从不同级别的列表中提取数据
- javascript - node.js puppeteer evaluate() 返回 Unexpected 对象。每次抛出 TypeError
- javascript - 在 React 中使用 document.write 从外部脚本编写 HTML 内容
- android - DialogFragment 正在抛出 ClassCastException onAttach
- python - 为什么十进制打印不同的输出?
- python - Qt 和 opencv 应用程序无法在虚拟环境中运行
- javascript - 每次单击“getLatestPrice”按钮时,如何使某些 ChainLink 聚合器提供的数据得到更新?