我有这样的数据:
Index SourceID ComparedID Distance
571 106 8 0.004846
572 106 11 0.000000
573 106 23 0.012712
574 107 84 0.002800
575 107 70 0.007555
它位于pandas
数据框中。我想弄清楚如何做到这一点:
我想从找到最小距离的数据框创建结果并返回ComparedID
。
所以输出看起来像是:
SourceID ComparedID Distance
106 11 0.000000
107 84 0.002800
我该怎么做?
答案 0 :(得分:2)
我不确定你需要什么,所以我在下面列出了两个选项。
<强> 1。没有按SourceID分组
这是获得2个最小距离的一种方法:
df.nsmallest(2, columns=['Distance'])
# Index SourceID ComparedID Distance
# 1 572 106 11 0.0000
# 3 574 107 84 0.0028
仅返回ComparisonID列表:
df.nsmallest(2, columns=['Distance'])['ComparedID'].tolist()
# [11, 84]
<强> 2。按SourceID分组
这里的想法是按距离排序,然后按SourceID删除重复项:
df.sort_values('Distance').drop_duplicates('SourceID')
结果:
Index SourceID ComparedID Distance
1 572 106 11 0.0000
3 574 107 84 0.0028
答案 1 :(得分:2)
您可以使用idxmin()
df.iloc[df.groupby('SourceID')['Distance'].idxmin(), :]
Index SourceID ComparedID Distance
1 572 106 11 0.0000
3 574 107 84 0.0028
答案 2 :(得分:1)
df.sort_values(by='Distance').groupby('SourceID').agg('first')
您希望按距离对数据框进行排序,并为每个'SourceID'
获取距离最小的行,即每个组的第一行。
以上产生以下输出:
Index ComparedID Distance
SourceID
106 572 11 0.0000
107 574 84 0.0028
当您使用分组依据时,分组的列最终会被编入索引,您可以通过随后重置索引来展平数据框,以获得您想要的输出
df.sort_values(by='Distance').groupby('SourceID').agg('first').reset_index()
输出:
SourceID Index ComparedID Distance
0 106 572 11 0.0000
1 107 574 84 0.0028