我有一个简单的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
非常感谢您提供任何提示:)
答案 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