我有一个数据框:
df = pd.DataFrame()
df['bird'] = ['shikra','shikra','eagle','eagle','eagle','crow','sparrow','sparrow']
df['bird2'] = [1,1,2,2,2,3,4,4]
df['n'] = ['a','b','c','d','e','f','g','h']
df['range'] = [1400,1600,np.nan,2800,3300,np.nan,800,600]
bird bird2 n range
0 shikra 1 a 1400.0
1 shikra 1 b 1600.0
2 eagle 2 c NaN
3 eagle 2 d 2800.0
4 eagle 2 e 3300.0
5 crow 3 f NaN
6 sparrow 4 g 800.0
7 sparrow 4 h 600.0
我想从大约数据中找到最大范围内的前2名鸟。
我使用了groupby
操作,如下所示:
df.groupby(['bird','bird2']).agg({'range':'max', 'n':'first'}).reset_index().sort_values('range', ascending=False).head(2)
其输出为:
bird bird2 range n
1 eagle 2 3300.0 c
2 shikra 1 1600.0 a
以上输出的唯一问题是column n
。当我在first
中选择了agg
时,它为对应的groupby值提供了第一个值,但实际上我想要的是n
的值,它与最大范围有关。
如何从n
为range
的{{1}}列中选择值
预期输出:
max
答案 0 :(得分:4)
首先使用DataFrame.sort_values
,然后通过DataFrame.drop_duplicates
删除两列中的重复项,并通过DataFrame.head
或DataFrame.iloc
选择最高值:
df = df.sort_values('range', ascending=False).drop_duplicates(['bird','bird2']).head(2)
#df = df.sort_values('range', ascending=False).drop_duplicates(['bird','bird2']).iloc[:2]
print (df)
bird bird2 n range
4 eagle 2 e 3300.0
1 shikra 1 b 1600.0
答案 1 :(得分:2)
您也可以直接使用max函数:
df.groupby(['bird','bird2']).max().reset_index().sort_values('range', ascending=False).head(2)
bird bird2 n range
1 eagle 2 e 3300.0
2 shikra 1 b 1600.0
正如jezreal提到的,在您的情况下,max还将找到最大字符串f。但是,当您按范围对它进行排序时,它就位了。