Python Pandas按COTA分组新增上一年最高Mark值列的实现方法
实现代码
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] }) # 转换日期格式,提取年份字段 df['Date'] = pd.to_datetime(df['Date'], dayfirst=True) df['Year'] = df['Date'].dt.year # 统计每个COTA每一年的Mark最大值 cota_year_max = df.groupby(['COTA', 'Year'])['Mark'].max().reset_index(name='current_year_max') # 构建上一年映射关系:当前年的最大值 = 下一年的上一年最大值 cota_year_max['map_year'] = cota_year_max['Year'] + 1 cota_year_max = cota_year_max.rename(columns={'current_year_max': 'Max_MarkLastYear'}) # 关联回原表得到结果 df = df.merge( cota_year_max[['COTA', 'map_year', 'Max_MarkLastYear']], left_on=['COTA', 'Year'], right_on=['COTA', 'map_year'], how='left' ) # 清理临时字段 df = df.drop(columns=['Year', 'map_year']) print(df)
逻辑说明
- 先将字符串格式的日期转换为Pandas日期类型,提取每条记录对应的年份,作为后续分组和匹配的依据
- 按
COTA+年份分组,计算每个分组的Mark最大值,得到每个COTA每年的最高Mark中间表 - 给中间表新增映射年份字段,值为原年份+1,这样中间表中某一年的最高Mark,就对应了映射年份的上一年最高Mark
- 将中间表和原表关联:用原表的
COTA+年份匹配中间表的COTA+映射年份,匹配不到的位置自动填充NaN,符合需求 - 最后删除计算过程中新增的临时字段,得到最终结果
内容的提问来源于stack exchange,提问作者Eric Alves
相关产品推荐
相关产品推荐

