首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >迭代一个DataFrame的行以将列添加到第二个DataFrame的更快方法

迭代一个DataFrame的行以将列添加到第二个DataFrame的更快方法
EN

Stack Overflow用户
提问于 2021-02-08 07:11:10
回答 2查看 81关注 0票数 0

我正试图找到一种更快的方法,将函数多次应用于DataFrames中的一组数据。

我有两个DataFrames:

  1. 参数:函数的每个参数都有一个列,每一行都是一个特定的参数集。还有一个列为每个集合指定唯一的名称。
  2. 原始数据:在列

中存储原始数据

对于每一组参数,我希望向原始的DataFrame中添加一个列,其中包含"func“的结果,并将列名设置为参数集名称。

目前,我正在遍历参数DataFrame的行,但我觉得有更好的方法来实现它。

我正在尝试查看是否有向量化的解决方案,但到目前为止,我一直没有成功地使用两个DataFrames。

在这篇文章中,我尝试遵循cs95 95的答案,但几乎所有向量化或列表理解的示例都只处理一个DataFrame:How to iterate over rows in a DataFrame in Pandas

有更好的方法吗?

我觉得那里可能是我错过的明显的东西。

代码语言:javascript
运行
复制
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"])

代码语言:javascript
运行
复制
    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
EN

回答 2

Stack Overflow用户

发布于 2021-02-08 07:51:50

您可以修改下面的代码以满足您的期望,我把第1行(原始= 11)留在了那里;应该很容易修改。

下面的代码避免了迭代,因为它可能非常慢。它所做的是首先从参数中获取值,然后对每一列进行数据“原始”乘法,以获得最终输出:

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2021-02-08 08:23:21

按照以下方式定义您的功能:

代码语言:javascript
运行
复制
def func2(dataCol, a, b, c):
    return dataCol[:, np.newaxis] + a[np.newaxis, :] + b[np.newaxis, :] * c[np.newaxis, :]

差异:

  • 第一个参数是一个源数据列,而不是整个DataFrame,
  • 3剩余的参数也是(取自参数),而不是单个值。

然后,为了得到你的结果,可以这样称呼它:

代码语言:javascript
运行
复制
data[parameters.name.tolist()] = func2(data.original, parameters.a,
    parameters.b, parameters.c)

使用%timeit,我检查了您和我的代码的执行时间。我的代码在为您的代码测量的60 %的时间内执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66097245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档