Как я могу просто объединить группы pandas GroupBy? - PullRequest
1 голос
/ 31 марта 2020

Я использую DataFrame.groupby () для группировки строк с одинаковым ключом, сохраняя при этом ранее отсортированный порядок строк. Я sh смогу объединить группы обратно в законченный DataFrame, чтобы строки с общим ключом следовали за первой такой строкой, а группы начинаются с наибольшего значения col в первую очередь. После долгих экспериментов и поиска метода раздельного применения-объединения для отдельного метода объединения я пришел к следующему подходу, который работает. То, что для этого требовалась функция идентификации с открытым кодом, подсказало мне, что я не использую GroupBy так, как это было задумано. Есть ли лучшая идиома?

df.sort_values(col, ascending=False).groupby(key, sort=False).apply(lambda g_df: g_df)

Я хотел бы знать, где в pandas документации Я мог бы ответить на этот вопрос сам.

1 Ответ

0 голосов
/ 31 марта 2020

Мы можем sort в первую очередь. Поскольку pd.unique порядок сохранения, он находит 'key', упорядоченный по их наибольшему значению. Затем, установив индекс и используя .loc, мы можем сгруппировать их все.

Пример данных

import pandas as pd
df = pd.DataFrame({'col': [1,2,3,4,5,6,7,8,9,10],
                   'key': list('abababcacb')})

Код

df = df.sort_values('col', ascending=False)
df = df.set_index('key').loc[df['key'].unique()].reset_index()

  key  col
0   b   10
1   b    6
2   b    4
3   b    2
4   c    9
5   c    7
6   a    8
7   a    5
8   a    3
9   a    1

Другой способ сделать то, что вы хотите, это создать вспомогательный столбец. Вы хотите отсортировать по максимальному значению 'col' внутри группы, поэтому используйте transform, чтобы передать результат в столбец помощника, по которому мы отсортировали, а затем отбросить.

df['key1'] = df.groupby('key')['col'].transform('max')
df = df.sort_values(['key1', 'col'], ascending=False).drop(columns='key1')

Если вы хотел использовать groupby вы на самом деле просто используете его для получения местоположения индекса. Прямой реализацией было бы просто concat групп, итерируя по объекту groupby:

df = pd.concat([gp for _,gp in df.sort_values('col', ascending=False).groupby('key', sort=False)])

Однако, поскольку вам просто нужно перестроить весь DataFranme, на самом деле нет необходимости разбивать его просто конкатить все обратно. Атрибут .groups хранит индексы. Объедините их в цепочку и нарежьте оригинальный DataFrame

from itertools import chain
idx = chain.from_iterable(df.sort_values('col', ascending=False)
                            .groupby('key', sort=False)
                            .groups.values())

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