pandas groupby возвращает дополнительный индекс - PullRequest
0 голосов
/ 08 июня 2019
dft = pd.DataFrame({'C1': ['A','A','B','B'], 
                    'C2': [1,2,3,4]}) 

def lam3(df):
    return pd.DataFrame({'X': ['C','D','E'], 
                    'Y': [11,22,33]})

Учитывая вышеупомянутый фрейм данных и функцию (которую я не могу изменить), я хотел бы запустить groupby + apply, чтобы каждая группа возвращала фрейм данных, как это

    C1  C2  X   Y
0   A   1   C   11
1   A   1   D   22
2   A   1   E   33
3   A   2   C   11
4   A   2   D   22
5   A   2   E   33
6   B   3   C   11
7   B   3   D   22
8   B   3   E   33
9   B   4   C   11
10  B   4   D   22
11  B   4   E   33

Выполнение ниже даетдополнительный столбец нумерованного индекса:

dft.groupby(['C1','C2']).apply(lam3)

Так что мне нужно сделать следующее, чтобы получить то, что я хочу:

dft.groupby(['C1','C2']).apply(lam3).reset_index().drop(columns='level_2')

Очевидно, это не является общим, так как level_2 зависит от того, сколько столбцовЯ использую в групповом режиме и слепо отбрасывая столбцы, начинающиеся с «уровня», потенциально могу удалить оригинальные столбцы.

Как использовать лямбда-функцию, которая возвращает фрейм данных в группе без возврата дополнительного индекса?

Вопрос похож на this , но каждая группа здесь возвращает фрейм данныхвместо серии.

РЕДАКТИРОВАТЬ: lam3 здесь только пример функции для демонстрации.В реальной версии могут быть операции, которые зависят от df.Дело в том, что функция lam3 возвращает фрейм данных в контексте groupby.Так что кросс-соединение не поможет

1 Ответ

0 голосов
/ 08 июня 2019

reset_index позволяет вам отбрасывать индекс по порядку с возможностью удаления. Так что вы можете попробовать:

dft.groupby(['C1','C2']).apply(lam3).reset_index(level=-1, drop=True) 

Выход:

       X   Y
C1 C2       
A  1   C  11
   1   D  22
   1   E  33
   2   C  11
   2   D  22
   2   E  33
B  3   C  11
   3   D  22
   3   E  33
   4   C  11
   4   D  22
   4   E  33
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...