pandas 应用参数列表

pandas apply with parameter list

我有一个简单的 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

非常感谢任何提示:)

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