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

Python Pandas实现同DataFrame同ID上年数据匹配求助

解决DataFrame新增对应ID上年数据的问题

嘿,我来帮你搞定这个困扰!你用merge出现后半部分全NaN的情况,大概率是合并逻辑没对齐——比如只按ID合并却没关联年份,或者复制数据时年份偏移处理错了,导致后面的行找不到匹配的上年数据。

其实有个更简洁高效的方法,用groupby结合shift就能轻松实现,比merge省心多了,咱们一步步来:

首选方法:groupby + shift

这种方法的核心是先按ID分组,再把每个组内的数据向下偏移一行,正好对应上一年的记录(前提是你的数据已经按ID和年份排好序啦)。

示例代码

假设你的DataFrame包含ID、year(年份)和value(要取上年值的列):

import pandas as pd

# 构造示例数据
data = {
    'ID': ['A', 'A', 'A', 'B', 'B', 'C'],
    'year': [2020, 2021, 2022, 2020, 2022, 2021],
    'value': [100, 150, 200, 50, 70, 30]
}
df = pd.DataFrame(data)

# 第一步:按ID和年份排序,确保顺序正确
df = df.sort_values(['ID', 'year'])

# 第二步:新增上年数据列
df['prev_year_value'] = df.groupby('ID')['value'].shift(1)

运行后你会看到:

  • 每个ID的第一条记录(最早年份)因为没有上年数据,会显示NaN,这是合理的
  • 后续每条记录的prev_year_value就是同ID上一年的value值

如果你的年份不是连续的(比如示例中B的2021年没有数据),shift会直接取上一条存在的记录;如果你需要严格匹配year-1的年份(哪怕该年份无数据也显示NaN),可以看下面的merge正确用法。

如果你还是想用merge(正确姿势)

如果一定要用merge,得保证合并的键是ID+偏移后的年份,具体步骤:

# 复制原数据,将年份加1,作为上年数据的匹配键
df_prev = df.copy()
df_prev['year'] = df_prev['year'] + 1
# 重命名列,避免合并后列名冲突
df_prev = df_prev.rename(columns={'value': 'prev_year_value'})

# 按ID和year左合并,保留原数据所有行
df = pd.merge(df, df_prev, on=['ID', 'year'], how='left')

这样就能准确匹配到同ID且年份正好是上一年的数据,不会出现大面积NaN的情况——之前你出现全NaN,大概率是没把年份作为合并键,导致匹配逻辑错误。

总结

  • 数据量较大时优先用groupby+shift,性能更好,代码更简洁
  • 用merge时必须同时按ID和year(偏移后)合并,才能保证匹配准确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:55:55