Панды применяются со списком параметров - PullRequest
2 голосов
/ 29 июня 2019

У меня есть простой объект DataFrame:

df = pd.DataFrame(np.random.random_sample((5,5)))
df["col"] = ["A", "B", "C", "A" ,"B"]

#simple function
def func_apply(df,param=1):
    pd.Series(np.random(3)*param,name=str(param))

Теперь применение функции приводит к ожидаемому кадру DataFrame

df.groupby('col').apply(func_apply)

    1           0         1         2
col                              
A    0.928527  0.383567  0.085651
B    0.567423  0.668644  0.689766
C    0.301774  0.156021  0.222140

Есть ли способ передать список параметров в groupby дляполучить что-то вроде этого?

#Pseudocode...
df.groupby('col').apply(func_apply, params=[1,2,10])

    1           0         1         2
par col                              
1    A    0.928527  0.383567  0.085651
1    B    0.567423  0.668644  0.689766
1    C    0.301774  0.156021  0.222140
2    A    0.526494  1.812780  1.515816
2    B    1.180539  0.527171  0.670796
2    C    1.507721  0.156808  1.695386
10   A    7.986563  5.109876  2.330171
10   B    2.096963  6.804624  2.351397
10   C    6.890758  8.079466  1.725226

Большое спасибо за любой намек :)

1 Ответ

1 голос
/ 29 июня 2019

IIUC,

apply допускает дополнительные параметры.Вам нужно передать его как keyword или позиционные агрументы, используя args с кортежем.То, как вы используете переданные параметры, зависит от вашего воображения.То есть это зависит от того, как вы пишете, вы применяете func, чтобы использовать их для получения желаемого результата.

Давайте возьмем ваши примерные данные.Я изменил ваш func_apply следующим образом, чтобы последовательно обрабатывать каждую группу, используя дополнительные params и объединить их в окончательный результат:

def func_apply(df,params=[1]):
     d = [pd.Series(np.random.random(3), name=str(par),index=['x', 'y', 'z']) for par in params]
     return pd.DataFrame(d)

Теперь вызовите apply func_apply и передайте [1, 2, 10]к нему (я использую keyword для передачи params):

df.groupby('col').apply(func_apply, params=[1, 2, 10])

Out[1102]:
               x         y         z
col
A   1   0.074357  0.850912  0.652096
    2   0.307986  0.267658  0.558153
    10  0.351000  0.743816  0.192400
B   1   0.179359  0.411784  0.535644
    2   0.905294  0.696661  0.794458
    10  0.635706  0.742784  0.963603
C   1   0.020375  0.693070  0.225971
    2   0.448988  0.288206  0.715875
    10  0.980669  0.474264  0.036715

Не передавая params, применить возвращается к значению по умолчанию:

df.groupby('col').apply(func_apply)

Out[1103]:
              x         y         z
col
A   1  0.499484  0.175008  0.331594
B   1  0.052399  0.965129  0.649668
C   1  0.053869  0.297008  0.793262
...