使用GroupBy在DataFrame中查找最小值

时间:2018-03-02 16:48:43

标签: python python-3.x pandas

我有这样的数据:

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

我该怎么做?

3 个答案:

答案 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