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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:45:32