[英]pandas apply function that returns a DataFrame
Say I have a DataFrame (or Series) of arguments
, and a function f
which takes those arguments and returns a DataFrame.
例如
arguments = pd.DataFrame({"a": [2, 3], "b": [10, 100]})
df = pd.DataFrame({"x": [1, 0, 0], "y": [0, 1, 0], "z": [0, 0, 1]})
def f(a, b):
return df*a*b
我想获得一个 DataFrame ,它将通过将f
应用于 arguments 的每一行中的arguments
获得的数据帧:
x y z
0 20 0 0
1 0 20 0
2 0 0 20
0 300 0 0
1 0 300 0
2 0 0 300
我可以通过如下显式构造结果来实现这一点......
pd.concat(f(a=row["a"], b=row["b"]) for _, row in arguments.iterrows())
...但是由于这基本上只是apply
返回 DataFrames 的 function,我想知道是否有 pandas 方法可以做到这一点。
也许您可以将 DataFrames 转换为 numpy arrays 并使用逐元素乘法:
multiplier = np.kron(arguments['a'].mul(arguments['b']).to_numpy(), np.ones(([*df.shape]), dtype=int)).T
pd.DataFrame(np.tile(df.to_numpy(), (len(arguments), 1)) * multiplier, columns=df.columns)
Output:
x y z
0 20 0 0
1 0 20 0
2 0 0 20
3 300 0 0
4 0 300 0
5 0 0 300
我认为你的解决方案很好。 它也非常可读,这很重要。 我唯一要改变的是你循环 dataframe 并传递 arguments 的方式。
代替用户iterrows
,您可以使用to_dict('series')
,它将返回一个可以很好地扩展为关键字 arguments 到f
的字典列表:
df = pd.concat(f(**args) for args in arguments.to_dict('records'))
Output:
>>> df
x y z
0 20 0 0
1 0 20 0
2 0 0 20
0 300 0 0
1 0 300 0
2 0 0 300
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.