Pandas按item分组后如何计算分组内最大最小年份对应value的差值
实现方法
你可以选择以下任意一种方案完成计算:
方案1:自定义分组聚合(最直观,一步完成)
直接对每个分组提取最大/最小年份对应的value做差:
import pandas as pd import numpy as np def year_value_diff(group): # 取分组内年份最小、最大值对应的行索引 min_year_idx = group['year'].idxmin() max_year_idx = group['year'].idxmax() # 返回差值 return group.loc[max_year_idx, 'value'] - group.loc[min_year_idx, 'value'] # 分组计算得到结果 res = df.groupby('item').apply(year_value_diff).reset_index(name='diff_value')
输出结果:
item diff_value 0 A 12 1 B 20
方案2:基于你已有代码继续开发
如果你已经计算得到了各分组的最大、最小年份,可以按如下步骤关联原表取值计算:
# 你的原有代码,调整为命名列方便后续关联 year_stat = df.groupby("item").agg( min_year=('year', np.min), max_year=('year', np.max) ).reset_index() # 关联最小年份对应的value year_stat = year_stat.merge( df, left_on=['item', 'min_year'], right_on=['item', 'year'], how='left' ).rename(columns={'value': 'min_value'}).drop('year', axis=1) # 关联最大年份对应的value year_stat = year_stat.merge( df, left_on=['item', 'max_year'], right_on=['item', 'year'], how='left' ).rename(columns={'value': 'max_value'}).drop('year', axis=1) # 计算最终差值 year_stat['diff_value'] = year_stat['max_value'] - year_stat['min_value']
方案3:排序后取首尾差值(代码最简)
先按item和year排序,分组后直接取最后一行value减第一行value即可:
df_sorted = df.sort_values(['item', 'year']) res = df_sorted.groupby('item')['value'].agg( lambda x: x.iloc[-1] - x.iloc[0] ).reset_index(name='diff_value')
内容的提问来源于stack exchange,提问作者Alex Dana
相关产品推荐
相关产品推荐

