如何在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)
接下来只需要两步:
- 先按
country和year排序,确保每个国家的年份是从小到大排列的(避免移位出错) - 按国家分组后,对
score列执行移位1位的操作
代码如下:
# 先排序保证顺序正确 df = df.sort_values(['country', 'year']) # 创建新列,分组移位获取上一年分数 df['previous_year_score'] = df.groupby('country')['score'].shift(1)
运行后你会得到想要的结果:
| country | year | score | previous_year_score |
|---|---|---|---|
| France | 2019 | 9 | NaN |
| France | 2020 | 10 | 9.0 |
| Germany | 2019 | 14 | NaN |
| Germany | 2020 | 15 | 14.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
相关产品推荐
相关产品推荐

