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

如何在DataFrame中对各年份列减去对应列的最大值?

解决方法:给DataFrame的年份列计算最大值与元素的差值

嘿,这个需求其实用pandas的矢量化操作就能轻松搞定,完全不用绕弯子写循环!我给你两种靠谱的实现方式,从高效简洁到灵活自定义都覆盖到了:

方法一:矢量化广播(推荐,性能最优)

这种方法利用pandas的广播特性,直接对年份列做整体运算,速度最快,代码也最简洁:

  1. 先筛选出所有年份列:
    如果你能明确年份列的名称,直接列出来就行;如果想自动识别,可以用列表推导式筛选(比如列名是数字或数字字符串的列):

    import pandas as pd
    
    # 假设你的DataFrame叫df
    # 自动筛选年份列(列名是整数或纯数字字符串)
    year_cols = [col for col in df.columns if isinstance(col, int) or (isinstance(col, str) and col.isdigit())]
    
  2. 执行差值计算:
    直接用每列的最大值减去原列的每个元素,pandas会自动按列匹配最大值完成广播:

    # 直接修改原DataFrame的年份列
    df[year_cols] = df[year_cols].max() - df[year_cols]
    
    # 如果不想修改原数据,先创建副本再操作
    # new_df = df.copy()
    # new_df[year_cols] = new_df[year_cols].max() - new_df[year_cols]
    

方法二:用apply自定义处理(适合需要额外逻辑的场景)

如果之后你需要对某些年份列加特殊判断(比如跳过特定值、处理缺失值的特殊逻辑),可以用apply遍历每一列来计算:

df[year_cols] = df[year_cols].apply(lambda col: col.max() - col)

这个方法更灵活,但性能比矢量化广播稍差,适合小数据集或者有自定义需求的场景。

示例演示

举个小例子验证效果:

# 创建示例DataFrame
data = {
    '1996': [10, 25, 57, 30],
    '1997': [3, 9, 5, 7],
    '类别': ['A', 'B', 'C', 'D']
}
df = pd.DataFrame(data)

# 筛选年份列
year_cols = [col for col in df.columns if col.startswith('19')]

# 计算差值
df[year_cols] = df[year_cols].max() - df[year_cols]

print(df)

运行后输出:

1996  1997 类别
0    47     6    A
1    32     0    B
2     0     4    C
3    27     2    D

完全符合你要的效果:1996列最大值57,每个元素都是57减去原数值;1997列最大值9,每个元素都是9减去原数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:38:04