我有一个表格,格式如下:
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')
但我不知道要添加什么来返回最小的'距离'。
最佳, 罗莎
答案 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