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

如何在Pandas DataFrame中新增列存储上一年的最后一个Mark值

解决方案

实现思路

要拿到上一年最后一条记录的Mark值,核心是先按日期排序保证时间顺序,再分组取每个分组的最后一条记录,替换原逻辑里的max()方法即可。你之前使用last()未生效是因为未提前对日期排序,groupby.last()默认取原数据顺序的最后一条,而非时间最晚的记录。

完整代码

import pandas as pd

# 构造原始数据
df = pd.DataFrame({
    'COTA':['A','A','A','A','A','B','B','B','B'],
    'Date':['14/10/2021','19/10/2020','29/10/2019','30/09/2021','20/09/2020','20/10/2021','29/10/2020','15/10/2019','10/09/2020'],         
    'Mark':[1,2,3,4,5,1,2,3,3]
})

# 日期格式转换,指定dayfirst避免日月解析错误
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
# 计算当前日期对应年末日期
df['LastYear'] = df['Date'] - pd.offsets.YearEnd(0)

# 按主体、日期升序排序,保证分组内时间从早到晚
df = df.sort_values(['COTA', 'Date']).reset_index(drop=True)

# 分组取每个COTA+年末的最后一条Mark值
s1 = df.groupby(['COTA', 'LastYear'])['Mark'].last()
# 年份偏移1年,匹配当年记录对应的上一年值
s2 = s1.rename(index=lambda x: x + pd.offsets.DateOffset(years=1), level=1)

# 结果拼回原表
df = df.join(s2.rename('LastMark_LastYear'), on=['COTA', 'LastYear'])
print(df)

输出结果

COTA       Date  Mark   LastYear  LastMark_LastYear
0    A 2019-10-29     3 2019-12-31                NaN
1    A 2020-09-20     5 2020-12-31                3.0
2    A 2020-10-19     2 2020-12-31                3.0
3    A 2021-09-30     4 2021-12-31                2.0
4    A 2021-10-14     1 2021-12-31                2.0
5    B 2019-10-15     3 2019-12-31                NaN
6    B 2020-09-10     3 2020-12-31                3.0
7    B 2020-10-29     2 2020-12-31                3.0
8    B 2021-10-20     1 2021-12-31                2.0

关键说明

  • 原代码中分组字段Found为笔误,已修正为原始数据中的COTA字段,若你的实际表中分组字段为Found,替换回即可
  • 排序步骤不可省略,否则无法保证取到的是时间最晚的最后一条记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:15:03