Python中Groupby后实现条件聚合:按银行统计2003年金额总和
按银行分组计算指定年份金额总和并添加新列
需求说明
给定包含year(年份)、bank(银行)、amt(金额)三列的DataFrame,需为每个银行计算2003年的amt总和,并将该值作为新列amt_2003显示在对应银行的所有行中。
初始数据
import pandas as pd df = pd.DataFrame({ 'year': [2001, 2002, 2003, 2001, 2002, 2003, 2001, 2002, 2003, 2001, 2002, 2003], 'bank': ['sbi', 'sbi', 'sbi', 'sbi', 'sbi', 'sbi', 'icici', 'icici', 'icici', 'icici', 'icici', 'icici'], 'amt': [1000, 2000, 3000, 4000, 5000, 6000, 1, 2, 3, 4, 5, 6] })
解决方案
方法1:先计算分组总和再映射(推荐,高效简洁)
先筛选2003年的数据,按银行分组求和得到各银行的2003年总金额,再通过map将值映射到原DataFrame的每一行:
# 计算各银行2003年的amt总和 bank_2003_total = df[df['year'] == 2003].groupby('bank')['amt'].sum() # 映射到原DataFrame生成新列 df['amt_2003'] = df['bank'].map(bank_2003_total)
方法2:分组后逐组计算
通过groupby对每个银行分组,在组内计算2003年的金额总和,并赋值给组内所有行:
df['amt_2003'] = df.groupby('bank').apply( lambda group: group[group['year'] == 2003]['amt'].sum() ).reset_index(level=0, drop=True)
最终结果
执行上述代码后,DataFrame会新增amt_2003列,结果如下:
print(df) # 输出结果: year bank amt amt_2003 0 2001 sbi 1000 9000 1 2002 sbi 2000 9000 2 2003 sbi 3000 9000 3 2001 sbi 4000 9000 4 2002 sbi 5000 9000 5 2003 sbi 6000 9000 6 2001 icici 1 9 7 2002 icici 2 9 8 2003 icici 3 9 9 2001 icici 4 9 10 2002 icici 5 9 11 2003 icici 6 9
内容的提问来源于stack exchange,提问作者Manas
相关产品推荐
相关产品推荐

