带有参数列表的大熊猫

时间:2019-06-28 22:05:05

标签: python pandas dataframe pandas-groupby split-apply-combine

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

答案 0 :(得分:1)

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)

现在调用应用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