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

基于年度周期的DataFrame列值跨年份差值计算求助

解决方案:计算跨年份的金额差值

我明白你要实现的是:给每行计算当前年份的Current Amount减去上一年份的Previous Amount,并且同一年的所有行共享同一个Change值。你的尝试逻辑没踩对关键点——需要先把每个年份的Previous Amount映射到下一年,而不是直接用行级的shift或where匹配。

分步实现代码

假设你的数据框名为df,按以下步骤操作:

  1. 构建上一年份的Previous Amount映射表
    先按年份分组提取每个年份的Previous Amount(从你的示例看,每个年份的该值是唯一的;如果实际有多个,可根据需求用sum()/mean()等聚合),然后将年份+1,这样就能对应到下一年的计算:

    import pandas as pd
    
    # 提取各年份的Previous Amount,生成映射表
    prev_year_data = df.groupby('Year')['Previous Amount'].first().reset_index()
    # 将年份+1,让该值对应到下一年的Change计算
    prev_year_data['Year'] = prev_year_data['Year'] + 1
    # 重命名列方便后续合并
    prev_year_data = prev_year_data.rename(columns={'Previous Amount': 'Last_Year_Previous_Amount'})
    
  2. 合并映射表到原数据
    通过年份将映射表和原数据合并,这样每一行都能拿到对应上一年的Previous Amount:

    df = df.merge(prev_year_data, on='Year', how='left')
    
  3. 计算Change列
    直接用当前Current Amount减去上一年的Previous Amount,2021年因为没有上一年数据,会自动得到NaN;如果需要格式化带逗号的数字,可额外处理:

    # 计算差值
    df['Change'] = df['Current Amount'] - df['Last_Year_Previous_Amount']
    # 可选:将数字格式化为带千分位逗号的样式(如你的示例)
    df['Change'] = df['Change'].apply(lambda x: f"{int(x):,}" if pd.notna(x) else 'NaN')
    

为什么你的原代码不生效?

  • 第一个尝试Df['Current Amount'] - Df['Previous Amount'].where(Df['Year']==Df['Year']-1):同一行的Year不可能等于Year-1,所以where返回全是NaN,结果自然不对。
  • 第二个尝试Df['Current Amount'] - Df['Previous Amount'].where(Df['Year']==Df['Year'].shift(-1)):shift(-1)是把下一行的年份移到当前行,这只能关联相邻行的年份,无法实现“上一年整体对应当前年所有行”的逻辑。

运行上述代码后,就能得到你期望的结果啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:04:09