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

