如何在Python的Pandas DataFrame中比较同Id行并删除高Dist行
解决方法
直接用Pandas的分组功能就能搞定,别再遍历行折腾了,效率低还容易出错。
核心思路
对Id分组后,保留每个组里Dist值最小的行(也就是删掉Dist更高的行),两种场景对应不同写法:
场景1:每个Id只保留一行Dist最小的(若有多个相同最小值,取第一行)
用groupby结合idxmin获取每个组内Dist最小的行索引,再筛选:
import pandas as pd # 构造示例DataFrame(匹配你提到的结构) df = pd.DataFrame({ 'Id': [1, 1, 2, 2, 2, 3], 'Dist': [5, 3, 10, 2, 7, 4], 'OtherCol': ['a', 'b', 'c', 'd', 'e', 'f'] }) # 处理逻辑 result_df = df.loc[df.groupby('Id')['Dist'].idxmin()]
处理后的结果:
| Id | Dist | OtherCol | |
|---|---|---|---|
| 1 | 1 | 3 | b |
| 3 | 2 | 2 | d |
| 5 | 3 | 4 | f |
场景2:每个Id保留所有Dist等于组内最小值的行
如果同一个Id下有多行Dist都是最小值,要全部保留,用transform生成每行对应的组内最小值,再筛选:
min_dist_per_id = df.groupby('Id')['Dist'].transform('min') result_df = df[df['Dist'] == min_dist_per_id]
比如某Id下有两行Dist都是2,这两行都会被保留。
为什么遍历行不可取?
Pandas是为矢量化操作设计的,遍历行(比如for i in df.iterrows())会把数据拆成单行处理,数据量大时速度极慢,而且手动处理分组、索引逻辑很容易出错,比如漏处理分组、重复删行等问题。
内容的提问来源于stack exchange,提问作者fluorine
相关产品推荐
相关产品推荐

