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

如何在DataFrame中基于历史年份分数创建`previous_year_score`新列

实现方法:获取对应国家上一年的分数

嘿,这个需求用pandas处理起来很简单,分两种场景给你解决方案:

场景1:数据中每个国家的年份是连续的(无缺失)

首先我们先构建你的示例数据方便测试:

import pandas as pd

data = {
    'country': ['France', 'France', 'Germany', 'Germany'],
    'year': [2020, 2019, 2020, 2019],
    'score': [10, 9, 15, 14]
}
df = pd.DataFrame(data)

接下来只需要两步:

  1. 先按country和year排序,确保每个国家的年份是从小到大排列的(避免移位出错)
  2. 按国家分组后,对score列执行移位1位的操作

代码如下:

# 先排序保证顺序正确
df = df.sort_values(['country', 'year'])

# 创建新列,分组移位获取上一年分数
df['previous_year_score'] = df.groupby('country')['score'].shift(1)

运行后你会得到想要的结果:

countryyearscoreprevious_year_score
France20199NaN
France2020109.0
Germany201914NaN
Germany20201514.0

场景2:数据中存在年份缺失(比如某国家缺了2018年)

如果你的数据里年份不是连续的,用移位可能会拿到错误的前一行数据,这时候可以用合并自身的方法来精准匹配year-1的分数:

# 复制一份数据,重命名年份列并加1,作为上一年的匹配表
df_prev = df.rename(columns={'year': 'prev_year', 'score': 'previous_year_score'})
df_prev['prev_year'] += 1

# 通过国家和年份进行左连接,匹配上一年的分数
df = pd.merge(df, df_prev, left_on=['country', 'year'], right_on=['country', 'prev_year'], how='left')

# 删掉多余的辅助列
df = df.drop('prev_year', axis=1)

这种方法不管年份有没有间隔,都会精准找到对应国家year-1的分数,找不到就显示NaN,适用性更广。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:12:32