在groupby之后获得最低价值 - 熊猫

时间:2017-10-05 13:35:24

标签: python pandas

我有一个表格,格式如下:

data = {'City' : ['London', 'Paris', 'Paris','NY' 'London'], 'Distance' : [5, 1, 7, 2, 6]}
df = pd.DataFrame(data)
df

    City    Distance
0   London  5
1   Paris   1
2   Paris   7
3   NY      2
4   London  6

我想创建一个包含所有具有唯一“City”的行的表,并且每当有2行或更多行具有相同的“City”值时,我希望它返回具有最低“距离”的行。 所以在这种情况下,我想要一个这样的表:

City    Distance
London  5
Paris   1
NY      2

我知道我可以使用:

df.groupby('City')

但我不知道要添加什么来返回最小的'距离'。

最佳, 罗莎

4 个答案:

答案 0 :(得分:3)

某些时候DDP_COMPLIANCE ,ONTRAC_COMPLIANCE_CD ,TECH_COMPLIANCE_STARTBY_TS 是不必要的,请尝试groupby

drop_duplicates

答案 1 :(得分:2)

每组最小Distance的索引需要DataFrameGroupBy.idxmin,然后按loc选择行:

df1 = df.loc[df.groupby('City', sort=False)['Distance'].idxmin()]
print (df1)
     City  Distance
0  London         5
1   Paris         1
3      NY         2

详情:

print (df.groupby('City', sort=False)['Distance'].idxmin())
City
London    0
Paris     1
NY        3
Name: Distance, dtype: int64

答案 2 :(得分:1)

我的观点是@jezrael在groupby内提供最惯用的方法。我自己在其他答案上提供了相同的解决方案。但是,这里有一些其他选择。

选项1
pd.DataFrame.nsmallest中使用apply 即使api有点笨拙,这也提供了清晰的逻辑。我认为此版本的nsmallest应该可供groupby对象使用。但是,对于大熊猫0.20.3,它不是。所以我们在通用apply方法中使用它。请务必在group_keys=False的调用中使用groupby,以避免出现尴尬的其他索引。

df.groupby('City', group_keys=False).apply(
    lambda d: d.nsmallest(1, columns='Distance'))

     City  Distance
0  London         5
3      NY         2
1   Paris         1

选项2
由@Wen拍摄,所以我删除了。

答案 3 :(得分:0)

您可以使用

>>> df.groupby(['City'], sort=False)['Distance'].min()
City
London    5
Paris     1
NY        2
Name: Distance, dtype: int64