我正试图找到一种更快的方法,将函数多次应用于DataFrames中的一组数据。
我有两个DataFrames:
中存储原始数据
对于每一组参数,我希望向原始的DataFrame中添加一个列,其中包含"func“的结果,并将列名设置为参数集名称。
目前,我正在遍历参数DataFrame的行,但我觉得有更好的方法来实现它。
我正在尝试查看是否有向量化的解决方案,但到目前为止,我一直没有成功地使用两个DataFrames。
在这篇文章中,我尝试遵循cs95 95的答案,但几乎所有向量化或列表理解的示例都只处理一个DataFrame:How to iterate over rows in a DataFrame in Pandas 。
有更好的方法吗?
我觉得那里可能是我错过的明显的东西。
import pandas as pd
def func(data, a, b, c):
return data["original"] + a + b * c
parameters = pd.DataFrame(
{
"name": ["set_1", "set_2", "set_3"],
"a": [1, 2, 3],
"b": [4, 5, 6],
"c": [7, 8, 9],
}
)
data = pd.DataFrame({"original": [10, 11, 12, 13, 14, 15]})
for i, row in parameters.iterrows():
data[row["name"]] = func(data, row["a"], row["b"], row["c"])
Inputs:
Parameters DataFrame:
name a b c
0 set_1 1 4 7
1 set_2 2 5 8
2 set_3 3 6 9
Original Data DataFrame:
original
0 10
1 11
2 12
3 13
4 14
5 15
Output:
original set_1 set_2 set_3
0 10 39 52 67
2 12 41 54 69
3 13 42 55 70
4 14 43 56 71
5 15 44 57 72
发布于 2021-02-08 07:51:50
您可以修改下面的代码以满足您的期望,我把第1行(原始= 11)留在了那里;应该很容易修改。
下面的代码避免了迭代,因为它可能非常慢。它所做的是首先从参数中获取值,然后对每一列进行数据“原始”乘法,以获得最终输出:
def func(left_df, right_df):
right_df = right_df.copy()
new_headers = right_df["name"].array
right_df = (right_df["a"] + right_df["b"] * right_df["c"]).array
right_df = dict(zip(new_headers, new))
return left_df.assign(
**{key: left_df["original"] + value for key, value in right_df.items()}
)
data.pipe(func, parameters)
original set_1 set_2 set_3
0 10 39 52 67
1 11 40 53 68
2 12 41 54 69
3 13 42 55 70
4 14 43 56 71
5 15 44 57 72
发布于 2021-02-08 08:23:21
按照以下方式定义您的功能:
def func2(dataCol, a, b, c):
return dataCol[:, np.newaxis] + a[np.newaxis, :] + b[np.newaxis, :] * c[np.newaxis, :]
差异:
然后,为了得到你的结果,可以这样称呼它:
data[parameters.name.tolist()] = func2(data.original, parameters.a,
parameters.b, parameters.c)
使用%timeit,我检查了您和我的代码的执行时间。我的代码在为您的代码测量的60 %的时间内执行。
https://stackoverflow.com/questions/66097245
复制相似问题