Включение имени группы в функцию apply pandas python

Отказаться от имени группового вызова использовать имя группы в применяемой лямбда-функции.

Например, если я выполняю итерацию по группам, я могу получить групповой ключ через следующий разбор кортежа:

for group_name, subdf in temp_dataframe.groupby(level=0, axis=0):
    print group_name

чтобы получить имя группы в функции apply, например:

temp_dataframe.groupby(level=0,axis=0).apply(lambda group_name, subdf: foo(group_name, subdf)

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

Спасибо!

Ответ 1

Я думаю, вы должны использовать атрибут name:

temp_dataframe.groupby(level=0,axis=0).apply(lambda x: foo(x.name, x))

должен работать, например:

In [132]:
df = pd.DataFrame({'a':list('aabccc'), 'b':np.arange(6)})
df

Out[132]:
   a  b
0  a  0
1  a  1
2  b  2
3  c  3
4  c  4
5  c  5

In [134]:
df.groupby('a').apply(lambda x: print('name:', x.name, '\nsubdf:',x))

name: a 
subdf:    a  b
0  a  0
1  a  1
name: b 
subdf:    a  b
2  b  2
name: c 
subdf:    a  b
3  c  3
4  c  4
5  c  5
Out[134]:
Empty DataFrame
Columns: []
Index: []

Ответ 2

Для тех кто пришел в поисках ответа на вопрос:

Включение имени группы в функцию преобразования pandas python

и в конечном итоге в этой теме, пожалуйста, читайте дальше.

Учитывая следующий вход:

df = pd.DataFrame(data={'col1': list('aabccc'),
                        'col2': np.arange(6),
                        'col3': np.arange(6)})

Данные:

    col1    col2    col3
0   a       0       0
1   a       1       1
2   b       2       2
3   c       3       3
4   c       4       4
5   c       5       5

Мы можем получить доступ к имени группы (которое видно из области вызывающей функции apply) следующим образом:

df.groupby('a') \
.apply(lambda frame: frame \
       .transform(lambda col: col + 3 if frame.name == 'a' and col.name == 'b' else col))

Выход:

    col1    col2    col3
0   a       3       0
1   a       4       1
2   b       2       2
3   c       3       3
4   c       4       4
5   c       5       5

Обратите внимание, что вызов для применения необходим для того, чтобы получить ссылку на sub pandas.core.frame.DataFrame (то есть frame), который содержит атрибут name соответствующей подгруппы. Атрибут имени аргумента преобразования (т.е. Столбца) относится к имени столбца/серии.

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

for grp_name, sub_df in df.groupby('col1'):
    for col in sub_df:
        if grp_name == 'a' and col == 'col2':
            df.loc[df.col1 == grp_name, col] = sub_df[col] + 3

Мой случай использования довольно редок, и это был единственный способ достичь моей цели. Тем не менее, я бы рекомендовал тщательно изучить документацию pandas, потому что, скорее всего, существует более простое векторизованное решение для того, для чего вам может понадобиться эта конструкция.