У меня есть датафрейм:
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
, он дает 1-е значение для соответствующего значения groupby, но на самом деле мне нужно значение n
, которое относится к максимальному диапазону.
Как выбрать значение из столбца n
, где range
равно max
Ожидаемый результат:
bird bird2 range n
1 eagle 2 3300.0 e
2 shikra 1 1600.0 b