如何在Pandas DataFrame中按分组获取对应最大付款额的Payer_ID
获取分组最大付款额对应的首个Payer_ID
原始数据与预期结果
原始DataFrame:
Group Payer_ID status Payment_Amount A 11 P 100 A 12 P 100 A 13 Q 50 A 14 P 100 A 15 P - B 11 P 10 B 16 Q 150
预期输出:
Group Payer_ID Payment_Amount A 11 100 B 16 150
规则说明
- 按
Group字段分组,提取每组中Payment_Amount最大的记录 - 若同一分组内存在多个相同的最大付款额,取原始数据中首个出现的
Payer_ID
现有代码的问题
你当前的代码仅能获取每组的最大付款额,无法关联对应的Payer_ID:
Max_Payment_Amt = df.groupby('Group',as_index=False)['Payment_Amount'].max()
解决方案
步骤1:预处理无效值
原始数据中Payment_Amount列的-属于无效数值,需先转为缺失值并统一为数值类型:
import pandas as pd # 替换无效值并转换类型 df['Payment_Amount'] = pd.to_numeric(df['Payment_Amount'], errors='coerce')
方法1:使用idxmax()提取目标行
idxmax()会返回每组中Payment_Amount最大值对应的第一个出现的行索引,直接通过索引提取目标行即可:
# 获取每组最大付款额的行索引 max_row_indices = df.groupby('Group')['Payment_Amount'].idxmax() # 提取对应行并保留需要的列 result = df.loc[max_row_indices, ['Group', 'Payer_ID', 'Payment_Amount']].reset_index(drop=True)
方法2:排序后分组取首行
通过排序确保最大付款额的行排在前面,且相同金额时保留原始顺序,再分组取每组第一行:
# 按Group升序、Payment_Amount降序、原始索引升序排序 sorted_df = df.sort_values( by=['Group', 'Payment_Amount', df.index], ascending=[True, False, True] ) # 分组后取每组首行,保留目标列 result = sorted_df.groupby('Group', as_index=False).first()[['Group', 'Payer_ID', 'Payment_Amount']]
两种方法都能满足需求,且天然支持"相同最大金额取首个Payer_ID"的规则。
内容的提问来源于stack exchange,提问作者Roshankumar
相关产品推荐
相关产品推荐

