按多列分组后筛选每个供应商对应金额最大的类别行
按多列分组后筛选每个供应商对应金额最大的类别行
嗨,我来帮你解决这个问题!你现在的需求是从已经按Supplier和Category分组求和后的DataFrame里,给每个供应商只保留金额最大的那个类别对应的行对吧?我给你几个简单好用的pandas实现方法,你可以根据场景选择:
方法一:使用groupby + idxmax()
这个方法会先定位每个供应商组内金额最大的行索引,再提取对应行,逻辑清晰直接:
# 假设你的DataFrame名为df # 获取每个供应商组内Amount最大值对应的行索引 max_row_indices = df.groupby('Supplier')['Amount'].idxmax() # 根据索引提取目标行,重置索引让结果更整洁 result_df = df.loc[max_row_indices].reset_index(drop=True)
方法二:使用rank()函数标记排名
通过给每个供应商组内的金额排名,筛选出排名第一的行,还能灵活处理同金额的情况:
# 给每个供应商组内的Amount降序排名,method='first'表示同金额时保留最先出现的行 df['amount_rank'] = df.groupby('Supplier')['Amount'].rank(ascending=False, method='first') # 筛选排名第一的行,删除临时排名列并重置索引 result_df = df[df['amount_rank'] == 1].drop('amount_rank', axis=1).reset_index(drop=True)
如果想保留所有金额并列最大的行,可以把method='first'换成method='min',这样所有最大值的行都会被标记为排名1。
方法三:排序后去重
先按供应商分组、金额降序排序,再保留每个供应商的第一行,操作直观易懂:
result_df = df.sort_values(by=['Supplier', 'Amount'], ascending=[True, False])\ .drop_duplicates(subset='Supplier')\ .reset_index(drop=True)
备注:内容来源于stack exchange,提问作者user2981194
相关产品推荐
相关产品推荐

