如何根据列分组字典对Pandas DataFrame按行计算分组列总和生成汇总列
实现方案
你可以通过自定义函数,配合Pandas按行求和的方法实现需求,完整实现代码如下:
import pandas as pd # 示例数据初始化 d = {'a': [0,1,0,1,1,1], 'b': [1,1,1,1,1,1], 'c': [0,0,0,0,0,1], 'd': [1,0,1,1,1,0]} col_group_map = {'a':'top','b':'bot','c':'top','d':'bot'} df = pd.DataFrame(d) # 自定义汇总函数 def add_group_total(df, group_name, col_group_map): # 筛选当前分组对应的所有列 target_cols = [col for col, group in col_group_map.items() if group == group_name] # 按行对目标列求和,生成汇总列 df[f'total_{group_name}'] = df[target_cols].sum(axis=1) return df # 调用函数添加两个分组的汇总列 df = add_group_total(df, 'top', col_group_map) df = add_group_total(df, 'bot', col_group_map) # 输出结果查看 print(df)
代码说明
- 函数入参里的
col_group_map就是你提供的列和分组的映射字典,如果你的映射关系是固定的,也可以直接写在函数内部不用作为入参传递 - 核心逻辑是
df[target_cols].sum(axis=1),其中axis=1指定按行计算,默认axis=0是按列计算 - 如果你需要一次性批量添加所有分组的汇总列,可以用循环批量调用函数:
for group in set(col_group_map.values()): df = add_group_total(df, group, col_group_map)
运行后得到的输出结果完全符合预期:
| a | b | c | d | total_top | total_bot |
|---|---|---|---|---|---|
| 0 | 1 | 0 | 1 | 0 | 2 |
| 1 | 1 | 0 | 0 | 1 | 1 |
| 0 | 1 | 0 | 1 | 0 | 2 |
| 1 | 1 | 0 | 1 | 1 | 2 |
| 1 | 1 | 0 | 1 | 1 | 2 |
| 1 | 1 | 1 | 0 | 2 | 1 |
内容的提问来源于stack exchange,提问作者chicagobeast12
相关产品推荐
相关产品推荐

