You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:50:52