Pandas: Как выделить (и суммировать) верхние N наблюдений в подкатегориях? - PullRequest
0 голосов
/ 28 июня 2018

В кадре данных панд, например:

     year      month  passengers
0    1949    January         112
1    1949   February         118
2    1949      March         132
3    1949      April         129
4    1949        May         121
5    1949       June         135
.
.
.
137  1960       June         535
138  1960       July         622
139  1960     August         606
140  1960  September         508
141  1960    October         461
142  1960   November         390
143  1960   December         432

Как я могу выделить (и выполнить расчеты) 3 месяца с наибольшим количеством пассажиров в год?

Тот же самый кадр данных может быть воспроизведен из набора данных морского происхождения:

import pandas as pd
import seaborn as sns

df = sns.load_dataset('flights')
df

Вот что я пробовал:

Следуя предложению в комментариях от к этой записи Я обнаружил, что могу переопределить фрейм данных, используя nlargest() после переиндексации фрейма данных:

df = df.set_index(['year', 'month'])
df2 = df.groupby(level=0)['passengers'].nlargest(3)
df2

выход:

year  year  month    
1949  1949  July         148
            August       148
            September    136
1950  1950  July         170
            August       170

Но по какой-то причине year index дублируется, и мне все равно придется переиндексировать, сгруппировать фрейм данных по годам и суммировать результаты. Это уже начинает запутываться, так что нет лучшего способа сделать это?

Вот и все, что нужно для легкого копирования:

import pandas as pd
import seaborn as sns
df = sns.load_dataset('flights')
df = df.set_index(['year', 'month'])
df2 = df.groupby(level=0)['passengers'].nlargest(3)

А вот форма желаемого выхода:

# Sum of top 3 months for each year (no index other than default pandas dataframe index)

    year    sum
0   1949    600 (the sum is made up)
1   1950    600
.
.
.
10  1960    600

Спасибо за любые предложения!

РЕДАКТИРОВАТЬ: Информация о системе:

Python 3.6.0

Панды 0.19.2

Windows 7

1 Ответ

0 голосов
/ 28 июня 2018

Я думаю, нужно GroupBy.apply, Series.nlargest и sum:

df = sns.load_dataset('flights')
df2 = df.groupby('year')['passengers'].apply(lambda x: x.nlargest(3).sum()).reset_index()
print (df2)
    year  passengers
0   1949         432
1   1950         498
2   1951         582
3   1952         690
4   1953         779
5   1954         859
6   1955        1026
7   1956        1192
8   1957        1354
9   1958        1431
10  1959        1579
11  1960        1763
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...