基于映射表高效实现Pandas多列GroupBy与Sum聚合
基于映射表实现Pandas多列分组聚合求和
问题场景
现有包含数值列及对应分组列的DataFrame:
| col1 | col2 | col3 | col1_cat | col2_cat | col3_cat | |
|---|---|---|---|---|---|---|
| 0 | 29 | 80 | 56 | low | high | medium |
| 1 | 19 | 50 | 88 | low | medium | high |
另有映射表DataFrame,定义数值列与对应分组列的关系:
| name | group |
|---|---|
| col1 | col1_cat |
| col2 | col2_cat |
| col3 | col3_cat |
需要基于映射表,一次性对所有数值列按对应分组列分组求和,得到如下结果:
| cat | col1_sum | col2_sum | col3_sum |
|---|---|---|---|
| high | 80 | 88 | |
| medium | 50 | 56 | |
| low | 48 |
解决方案
步骤1:将映射表转为字典
先把映射表转换成键为数值列名、值为分组列名的字典,方便后续批量处理:
import pandas as pd # 构造原始数据 df = pd.DataFrame({ 'col1': [29, 19], 'col2': [80, 50], 'col3': [56, 88], 'col1_cat': ['low', 'low'], 'col2_cat': ['high', 'medium'], 'col3_cat': ['medium', 'high'] }) # 构造映射表 mapping = pd.DataFrame({ 'name': ['col1', 'col2', 'col3'], 'group': ['col1_cat', 'col2_cat', 'col3_cat'] }) # 转为字典 col_group_map = mapping.set_index('name')['group'].to_dict()
步骤2:批量分组求和并合并结果
循环处理每一对数值列和分组列,执行分组求和后,将所有结果合并为最终DataFrame:
# 初始化空字典存储各列求和结果 sum_results = {} for col, group_col in col_group_map.items(): # 按分组列对数值列求和,并重命名列 sum_series = df.groupby(group_col)[col].sum().rename(f'{col}_sum') sum_results[col] = sum_series # 合并所有结果,使用outer join保留所有分组类别 final_df = pd.concat(sum_results.values(), axis=1).reset_index().rename(columns={'index': 'cat'}) # 可选:将空值替换为空字符串(匹配目标输出格式) final_df = final_df.fillna('')
执行后得到的final_df即为目标结果:
cat col1_sum col2_sum col3_sum 0 high 80 88 1 medium 50 56 2 low 48
内容的提问来源于stack exchange,提问作者WarlockQ
相关产品推荐
相关产品推荐

