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
相关产品推荐
相关产品推荐

