You need to enable JavaScript to run this app. Pandas按item分组DataFrame,如何取每组两列乘积最大的对应行数据
优惠活动
大模型
产品
解决方案
定价
更多

Pandas按item分组DataFrame,如何取每组两列乘积最大的对应行数据

为什么之前的方法得不到正确结果

你用df.groupby("item").max()拿到错误结果,根源是这个方法的聚合逻辑是逐列独立计算最大值,完全不保留同一行的字段关联:

  • 拿F分组举例,单独算width列的最大值是15,单独算length列的最大值是19,这两个值分属两个完全不同的原始行,被无关联拼接成了错误的条目
  • 这种逐列打散聚合的逻辑,从根本上和你“取整行中width*length乘积最大的条目”的需求不匹配,单靠调整分组参数解决不了这个拼接问题。
正确实现思路

核心是要先把“判断哪个行是组内最优”的逻辑落地:先计算每行的width*length作为判断依据,再定位每个分组内对应乘积最大的完整行,最后提取需要的width、length字段,常用两种可直接复用的实现方式:

方法1:用idxmax直接定位目标行索引

这是性能最好的实现,尤其适合数据量较大的场景:

  1. 先给每行加临时列,存储width和length的乘积
    df["area"] = df["width"] * df["length"]
    
  2. 按item分组,拿到每个组内area值最大的行的索引值
    target_rows = df.groupby("item")["area"].idxmax()
    
  3. 通过索引取出对应行的目标字段,重置索引让结果更整洁
    result = df.loc[target_rows, ["item", "width", "length"]].reset_index(drop=True)
    

方法2:排序后取分组首行

这种方式灵活性高,后续如果要调整排序规则(比如乘积相同的时候优先取width更大的行),修改排序逻辑即可实现:

  1. 同样先加临时乘积列
    df["area"] = df["width"] * df["length"]
    
  2. 先按item排序,再按area值降序排,让每个分组里乘积最大的行自动排到组内最前面
    df_sorted = df.sort_values(["item", "area"], ascending=[True, False])
    
  3. 每个分组只取第一行,提取需要的字段
    result = df_sorted.groupby("item").head(1)[["item", "width", "length"]].reset_index(drop=True)
    

两种方法跑完的输出完全符合预期:

itemwidthlength
F1019
R63
X310

小提示:临时计算的area列如果后续不需要,可以在结果生成后用df.drop(columns="area", inplace=True)清理掉,不会影响最终结果。


内容的提问来源于stack exchange,提问作者amiref

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 16:15:04