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