如何用Pandas生成含多列不同聚合规则的分组汇总表?
按性别分组的多列自定义聚合汇总表实现思路
数据集
import pandas as pd pd.DataFrame(data={"grade":[10,5,9,7], "sex": ["F", "F", "M", "M"], "pred_1": [1,0,1,1], "pred_2": [0,0,1,1], "pred_3": [0,0,0,1]})
对应的表格:
| grade | sex | pred_1 | pred_2 | pred_3 |
|---|---|---|---|---|
| 10 | F | 1 | 0 | 0 |
| 5 | F | 0 | 0 | 0 |
| 9 | M | 1 | 1 | 0 |
| 7 | M | 1 | 1 | 1 |
需求说明
目前用pd.pivot_table(df, values=pred_cols, index=["sex"])能按sex分组统计pred列,但需要给不同列指定不同聚合函数,同时新增mean_grade、min_grade这类grade列的聚合项,最终生成一张汇总表。
实现思路
- 拆分聚合任务:把列分成两类,一类是
pred_*系列列,一类是grade列,分别定义对应的聚合规则 - 分组合并法:
- 单独对
pred_*列做分组聚合,用pivot_table或groupby.agg指定你需要的聚合函数(比如求和、均值) - 单独对
grade列按sex分组,用agg指定mean、min等函数,同时给结果列重命名为mean_grade、min_grade - 把两个聚合后的结果按
sex列合并(用merge或join,因为两者都是以sex为索引/键),得到完整的汇总表
- 单独对
- 一步聚合法:直接用
groupby.agg的字典参数,一次性指定所有列的聚合规则,示例如下:
之后可以用df.groupby("sex").agg({ "grade": ["mean", "min"], "pred_1": "sum", "pred_2": "mean", "pred_3": "sum" })columns.map整理列名,把多级列名改成更直观的单一名称(比如把grade_mean调整为mean_grade)
内容的提问来源于stack exchange,提问作者juanmac
相关产品推荐
相关产品推荐

