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

如何用Python Pandas方法链与assign动态添加年度求和的total列?

动态计算年度列总和的Pandas优雅写法

需求说明

需要为DataFrame新增名为total的列,对所有年度列(数据均为整数)按行求和。由于每年会新增年份列(如2024),要求实现动态适配,避免手动维护列名列表,同时使用Pandas方法链结合assign运算符完成。

数据示例

id name     2018 2019 2020 2021 2022  type
1  John      0    1    0    0    2    A
2  Bill      1    5    4    0    0    B
3  Tom       0    0    2    0    5    B
4  Mary      0    1    1    0    0    A

预期输出

id name     2018 2019 2020 2021 2022 type total
1  John      0    1    0    0    2    A   3
2  Bill      1    5    4    0    0    B   10
3  Tom       0    0    2    0    5    B   7
4  Mary      0    1    1    0    0    A   2

现有临时方案(存在缺陷)

手动列出所有年度列,新增年份后需修改代码,无法动态适配:

(
     df
     .assign(Total = lambda x: x['2018'] + x['2019'] + x['2020'] + x['2021'] + x['2022'])
)

优雅解决方案

方法1:正则匹配年度列(推荐)

利用filter结合正则表达式匹配4位数字的列名(即年度列),自动适配新增年份:

(
    df
    .assign(total=lambda x: x.filter(regex=r'^\d{4}$').sum(axis=1))
)
  • 原理:regex=r'^\d{4}$'精准匹配以4位数字开头且结尾的列名,定位所有年度列;sum(axis=1)按行求和得到每行的年度总和。
  • 优势:无需关心年度列的位置或数量,新增年份列后代码无需修改。

方法2:按列位置切片(适合列位置固定场景)

如果年度列固定位于name和type之间,可通过iloc切片定位:

(
    df
    .assign(total=lambda x: x.iloc[:, 2:-1].sum(axis=1))
)
  • 原理:iloc[:,2:-1]选取第2列(索引从0开始,对应2018)到倒数第2列(对应2022)的所有列,再按行求和。
  • 注意:仅当列的顺序固定时适用,若后续列位置调整需同步修改切片参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:55:31