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

Pandas:基于两列配对值查找指定列最小值并保留原DataFrame行顺序及对应列值的实现方法

解决分组保留最小成本对应行原始列的问题

你的问题核心在于:使用groupby.agg(min)时,Pandas会对每一列单独计算最小值,而不是提取Total_cost最小的那一行的所有原始列值,这就导致了ID_inter_start、ID_inter_end等列和最小成本行错位。

下面提供两种可靠的解决方案,都能保留目标行的所有原始列,同时保持这些行在原DataFrame中的出现顺序:


方法一:用transform筛选组内最小值行

这种方法通过计算每组的最小成本,再筛选出原DataFrame中成本等于组内最小值的行,逻辑直观且易于理解:

# 为每行添加对应组的最小成本值
df['group_min_cost'] = df.groupby(['NUTS_ID_from', 'NUTS_ID_to'])['Total_cost'].transform('min')

# 筛选出成本等于组内最小值的行,同时删除临时列
result_df = df[df['Total_cost'] == df['group_min_cost']].drop(columns=['group_min_cost'])

针对你提供的初始数据集片段,运行后会得到完全符合期望的输出:

NUTS_ID_fromID_inter_startID_inter_endNUTS_ID_toTotal_cost
0DE111DEA12DE403DE1201886.332
3DE113DEA19DE408DE1311858.129
5DE115DEA23DE511DE1661434.235

方法二:用idxmin定位最小成本行的索引

这种方法先找到每组中Total_cost最小的行的索引,再通过索引提取原始行,最后按原DataFrame的索引顺序排序,保证输出顺序符合预期:

# 获取每个组中Total_cost最小的行的索引
min_row_indices = df.groupby(['NUTS_ID_from', 'NUTS_ID_to'])['Total_cost'].idxmin()

# 按原DataFrame的索引顺序提取行,保证输出顺序和原数据中选中行的出现顺序一致
result_df = df.loc[min_row_indices.sort_values()]

这个方法的优势是不需要创建临时列,直接通过索引定位目标行,效率更高,结果同样符合你的要求。


为什么之前的方法失效?

你之前使用的groupby.agg(min)会对每一列独立执行min操作:

  • 对Total_cost列确实会取组内最小值
  • 但对ID_inter_start、ID_inter_end这类字符串列,会取字典序最小的字符串,而不是对应最小成本行的原始值,这就导致了列值错位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:19:07