基于年度周期的DataFrame列值跨年份差值计算求助
解决方案:计算跨年份的金额差值
我明白你要实现的是:给每行计算当前年份的Current Amount减去上一年份的Previous Amount,并且同一年的所有行共享同一个Change值。你的尝试逻辑没踩对关键点——需要先把每个年份的Previous Amount映射到下一年,而不是直接用行级的shift或where匹配。
分步实现代码
假设你的数据框名为df,按以下步骤操作:
构建上一年份的
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'})合并映射表到原数据
通过年份将映射表和原数据合并,这样每一行都能拿到对应上一年的Previous Amount:df = df.merge(prev_year_data, on='Year', how='left')计算
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
相关产品推荐
相关产品推荐

