Как сохранить значение строки других столбцов в Groupby? - PullRequest
3 голосов
/ 27 мая 2019

У меня есть датафрейм:

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

Ответы [ 2 ]

4 голосов
/ 27 мая 2019

Сначала используйте 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
2 голосов
/ 27 мая 2019

Вы также можете напрямую использовать функцию 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

Как упоминает Джезреал, max также найдет максимальную строку f в вашем случае.Но когда вы сортируете его по диапазону, оно становится на свои места.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...