You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于映射表高效实现Pandas多列GroupBy与Sum聚合

基于映射表实现Pandas多列分组聚合求和

问题场景

现有包含数值列及对应分组列的DataFrame:

col1col2col3col1_catcol2_catcol3_cat
0298056lowhighmedium
1195088lowmediumhigh

另有映射表DataFrame,定义数值列与对应分组列的关系:

namegroup
col1col1_cat
col2col2_cat
col3col3_cat

需要基于映射表,一次性对所有数值列按对应分组列分组求和,得到如下结果:

catcol1_sumcol2_sumcol3_sum
high8088
medium5056
low48

解决方案

步骤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 00:20:30