Pandas按Entity和Year分组取最大consumption,相同值时取最大Year
解决方法
你的问题出在groupby(['Entity','Year'])——这样是按实体+年份的组合分组,相当于把每个年份的消费值单独取最大(其实就是自身),根本没实现“找每个实体的最大消费值,再对应最大年份”的目标。
下面给两种高效的实现方式:
方法一:先筛选最大消费值,再取对应最大年份
# 第一步:计算每个实体的消费最大值 entity_max_cons = df.groupby('Entity')['consumption'].max().reset_index(name='max_cons') # 第二步:匹配原数据中消费值等于最大值的行 matched = df.merge(entity_max_cons, on='Entity') matched = matched[matched['consumption'] == matched['max_cons']] # 第三步:对每个实体,保留年份最大的行 result = matched.groupby('Entity').apply(lambda g: g[g['Year'] == g['Year'].max()]).reset_index(drop=True) # 保留需要的列 result = result[['Entity', 'Year', 'consumption']]
方法二:排序后取每组首行(更简洁)
先按实体分组,组内按消费值降序、年份降序排序,这样每组的第一行就是消费值最大且年份最新的记录:
# 排序:实体升序,消费降序,年份降序 sorted_df = df.sort_values(['Entity', 'consumption', 'Year'], ascending=[True, False, False]) # 按实体分组取首行 result = sorted_df.groupby('Entity').first().reset_index() # 调整列顺序(可选,确保和需求一致) result = result[['Entity', 'Year', 'consumption']]
两种方法都能得到你要的['Entity','Year','consumption']结构的DataFrame,当同一实体有多个年份对应相同最大消费值时,自动保留年份最大的那一行。
内容的提问来源于stack exchange,提问作者Keith Taylor
相关产品推荐
相关产品推荐

