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_from | ID_inter_start | ID_inter_end | NUTS_ID_to | Total_cost | |
|---|---|---|---|---|---|
| 0 | DE111 | DEA12 | DE403 | DE120 | 1886.332 |
| 3 | DE113 | DEA19 | DE408 | DE131 | 1858.129 |
| 5 | DE115 | DEA23 | DE511 | DE166 | 1434.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
相关产品推荐
相关产品推荐

