如何在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
相关产品推荐
相关产品推荐

