Группа панд по годам фильтрует фрейм данных по n наибольшим значениям - PullRequest
1 голос
/ 11 декабря 2019

У меня есть датафрейм на часовом уровне с несколькими столбцами. Я хочу извлечь все строки (содержащие все столбцы) из 10 верхних значений определенного столбца для каждого года в моем фрейме данных.

До сих пор я запустил следующий код:

df = df.groupby([df.index.year])['totaldemand'].apply(lambda grp: grp.nlargest(10)))

Проблема здесь в том, что я получаю только 10 лучших значений для каждого года этого конкретного столбца, а остальные столбцы я теряю. Как я могу сделать эту операцию и иметь соответствующие значения других столбцов, которые соответствуют 10 лучшим значениям в год моего столбца totaldemand?

Ответы [ 3 ]

1 голос
/ 11 декабря 2019

Мы обычно делаем head после sort_values

df = df.sort_values('totaldemand',ascending = False).groupby([df.index.year])['totaldemand'].head(10)
0 голосов
/ 11 декабря 2019

nlargest можно применить к каждой группе, минуя столбец для поиска самых больших значений.

Итак, запустите:

df.groupby([df.index.year]).apply(lambda grp: grp.nlargest(3, 'totaldemand'))

Конечно, в финалеверсию замените 3 на ваше фактическое значение.

0 голосов
/ 11 декабря 2019

Получите индекс вашего запроса и используйте его в качестве маски на исходном df:

idx = df.groupby([df.index.year])['totaldemand'].apply(lambda grp: grp.nlargest(10))).index.to_list()
df.iloc[idx,]

(или что-то в этом роде, я не могу сейчас тестировать без каких-либо тестовых данных)

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