Может ли функция apply в pandas groupby вернуть более одного фрейма данных? - PullRequest
0 голосов
/ 19 апреля 2020

Я хочу сделать две слегка отличающиеся операции в apply функциях для groupby, как указано в следующем коде:

import pandas as pd
df = pd.DataFrame({'x' : [1,2,2], 'y':['aaa','bbb','ccc']})
print(df)

def func1(x):
    stackrow = pd.concat([x, x], axis=0, keys=['a', 'b'], names=['w', 'z'])
    return(stackrow)

df2 = df.groupby('x').apply(func1)
print("***********************\ndf2:")
print(df2)

def func2(x):
    stackcol = pd.concat([x, x], axis=1, keys=['c', 'd'], names=['w', 'z'])
    return(stackcol)

df3 = df.groupby('x').apply(func2)
print("***********************\ndf3:")
print(df3)

Однако, как я уже говорил, func1 и func2 в мой реальный пример имеет существенно перекрывающуюся функциональность, и я не хочу повторно извиняться за код для этой общей функциональности. Мне было интересно, работает ли следующий код:

def func(x):
    stackrow = pd.concat([x, x], axis=0, keys=['a', 'b'], names=['z'])
    stackcol = pd.concat([x, x], axis=1, keys=['c', 'b'], names=['w'])
    return(stackrow, stackcol)

df4, df5 = df.groupby('x').apply(func)

print("***********************\ndf4:")
print(df4)
print("***********************\ndf5:")
print(df5)

Но, похоже, он не работает как df2!=df4 и df3!=df5. Есть идеи?

1 Ответ

1 голос
/ 19 апреля 2020

Вы можете перебирать группы и напрямую вызывать функцию

gb = df.groupby('x') 
for group_name, group_lables in gb.groups.items(): 
    df4, df5 = func(gb.get_group(group_name)) 
    # do something more with the dfs?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...