使用groupby.sum后如何筛选出仅含最大值的观测数据?
如何在groupby求和后筛选出每组最大值的观测数据?
先给出你的样本数据:
import pandas as pd df = pd.DataFrame({ 'Company': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'], 'Model': ['A1', 'A2', 'A1', 'A3', 'A1', 'A2', 'A2', 'A3'], 'Units_sold': [55, 67, 58, 72, 52, 64, 68, 83] })
执行分组求和后,先把结果转为普通DataFrame(方便后续处理):
sum_df = df.groupby(['Company', 'Model'])['Units_sold'].agg('sum').reset_index()
此时输出为:
Company Model Units_sold 0 A A1 113 1 A A2 67 2 A A3 72 3 B A1 52 4 B A2 132 5 B A3 83
要筛选出每个Company下Units_sold总和最大的记录,有两种实用方法:
方法一:用transform标记组内最大值
transform会为每条数据生成对应分组的最大值,直接匹配筛选即可:
# 为每条数据添加对应Company组的最大销量总和 sum_df['group_max'] = sum_df.groupby('Company')['Units_sold'].transform('max') # 筛选销量总和等于组内最大值的记录,删除辅助列 result = sum_df[sum_df['Units_sold'] == sum_df['group_max']].drop('group_max', axis=1) # 还原为多级索引格式 result = result.set_index(['Company', 'Model'])
方法二:排序后取每组第一条
先按Company升序、Units_sold降序排序,再按Company分组取第一条:
sum_df = df.groupby(['Company', 'Model'])['Units_sold'].agg('sum').reset_index() # 按指定规则排序 sorted_df = sum_df.sort_values(['Company', 'Units_sold'], ascending=[True, False]) # 分组取每组第一条记录并重置索引 result = sorted_df.groupby('Company').head(1).set_index(['Company', 'Model'])
最终结果符合你的期望:
Company Model A A1 113 B A2 132
内容的提问来源于stack exchange,提问作者salman
相关产品推荐
相关产品推荐

