繁体   English   中英

pandas 应用返回 DataFrame 的 function

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM