如何在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
相关产品推荐
相关产品推荐

