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

如何在Pandas中按分组生成指定列值的聚合新列?

解决Pandas分组后按指定类别聚合生成新列的问题

嘿,作为Pandas新手,你完全没必要用for循环来做这个!Pandas自带的工具就能高效搞定这类需求,比手动循环简洁太多,而且速度快得多。下面给你两种常用的实现方法:

方法一:用pivot_table直接生成结果

pivot_table是处理这类“分组-按类别聚合-重塑列”需求的利器,一步就能帮你完成大部分工作:

import pandas as pd

# 先构建你的DataFrame
data = {'col1': ['tom', 'tom', 'tom', 'jerry', 'jerry', 'jerry', 'scooby', 'scooby', 'scooby'], 
        'col2': [2,3,5,1,4,5,8,6,1], 
        'col3':['cash', 'gas', 'online', 'online', 'online', 'gas', 'cash', 'dogfood', 'cheese']}
df = pd.DataFrame(data)

# 生成透视表,自动按col1分组,按col3的类别聚合col2的求和
result = df.pivot_table(
    index='col1',       # 分组的列
    columns='col3',     # 要转成新列的类别列
    values='col2',      # 要聚合的数值列
    aggfunc='sum',      # 聚合方式:求和
    fill_value=0        # 没有对应类别的填充0
)

# 只保留你需要的gas、cash、online三列,并重命名列名
result = result[['gas', 'cash', 'online']].rename(
    columns={'gas': 'gas_sum', 'cash': 'cash_sum', 'online': 'online_sum'}
)

# 把col1从索引变回普通列(可选,根据你的需求)
result = result.reset_index()

print(result)

运行后就能得到你想要的结果:

col1  gas_sum  cash_sum  online_sum
0   jerry        5         0           5
1  scooby        0         8           0
2     tom        3         2           5

方法二:用groupby + unstack实现

如果你更习惯用groupby,可以先分组求和,再把类别行转成列:

# 先按col1和col3分组,对col2求和
grouped = df.groupby(['col1', 'col3'])['col2'].sum()
# 把col3的层级从行转成列,缺失值填充0
result = grouped.unstack(fill_value=0)
# 筛选并重命名列,重置索引
result = result[['gas', 'cash', 'online']].rename(
    columns=lambda x: f"{x}_sum"
).reset_index()

这个方法和第一种结果完全一致,只是步骤拆分得更细,适合理解分组和重塑的过程。

为什么不用for循环?

Pandas的这些内置方法都是向量化操作,底层用C实现,比Python的for循环快几十甚至上百倍,尤其是当你的数据量很大的时候。而且代码更简洁,可读性更强,后期维护也更方便。

内容的提问来源于stack exchange,提问作者Joram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:32:43