You need to enable JavaScript to run this app. Pandas分组后对多列执行idxmin时如何保留所有并列最小值行
优惠活动
大模型
产品
解决方案
定价
更多

Pandas分组后对多列执行idxmin时如何保留所有并列最小值行

问题核心原因

原生pandas.Series.idxmin()的设计逻辑是仅返回组内第一个出现的最小值对应的索引,既无法抓取同列所有并列最小值的行,还会因为多列命中同一索引导致重复取行——这也是你现有输出里出现重复行、漏取并列最小行的根本原因。

适配需求的实现方案

方案完全沿用你原有的动态数值列选择逻辑(自动适配任意数量的数值列,不需要硬编码列名),实现「每个分组内抓取所有数值列对应的全部最小行、自动去重」的效果。

1. 动态识别数值列

和你原代码的取值规则完全一致,自动选取从第3列开始的所有列作为计算对象,后续新增的数值列会自动适配,不需要手动调整:

value_cols = df.columns[2:].tolist()

2. 分组提取逻辑

推荐使用向量化写法,大样本数据下性能远高于逐行循环:

def pick_group_min_rows(group_df):
    # 生成布尔标记矩阵:逐单元格判断是否等于所在列的组内最小值
    is_col_min = group_df[value_cols].eq(group_df[value_cols].min())
    # 只要某一行在任意一个数值列上命中最小值,就保留该行
    keep_row_mask = is_col_min.any(axis=1)
    return group_df[keep_row_mask]

3. 整合生成最终结果

result_df = (
    df.groupby('Virus', as_index=False)
    .apply(pick_group_min_rows)
    # 重置索引,去掉groupby生成的多层冗余索引
    .reset_index(drop=True, level=0)
)
效果说明
  • 无漏取:比如单个分组内某数值列存在多个并列最小值,所有符合条件的行都会被完整抓取,不会只返回第一行
  • 无重复:如果某一行同时是多个数值列的最小值,只会保留一次,不会出现和现有输出一样的重复行
  • 兼容现有inf值:计算列最小值时会自动排除无匹配的inf项,如果分组内某列全为inf,则所有行都会被保留
  • 动态适配:不需要修改代码即可支持后续新增的任意数量数值列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 17:45:02