gpt4 book ai didi

python - 如何使用依赖于其他列的值有效地将多列添加到 pandas 数据框

转载 作者:太空狗 更新时间:2023-10-30 00:01:19 25 4
gpt4 key购买 nike

我有什么:

  • 具有多行和多个现有列的数据框(python、pandas)。
  • Python 3.6,所以依赖于该特定版本的解决方案对我来说很好(但显然也适用于早期版本的解决方案也很好)

我想做的事情:

  • 向数据框添加多个附加列,其中这些新列中的值都以某种方式依赖于同一行中现有列中的值。
  • 必须保留数据帧的原始顺序。如果解决方案更改了顺序,我可以在之后通过基于现有列之一手动排序来恢复它,但显然这会引入额外的开销。

我已经有了以下代码,它可以正常工作。但是,性能分析表明这段代码是我代码中的重要瓶颈之一,所以我想尽可能地优化它,我也有理由相信这应该是可能的:

df["NewColumn1"] = df.apply(lambda row: compute_new_column1_value(row), axis=1)
df["NewColumn2"] = df.apply(lambda row: compute_new_column2_value(row), axis=1)

# a few more lines of code like the above

我将此解决方案基于对 this one 等问题的回答(这是一个类似于我的问题,但具体是关于添加一个新列,而我的问题是关于添加许多新列)。我想这些 df.apply() 调用中的每一个都是通过遍历所有行的循环在内部实现的,我怀疑应该可以使用仅遍历所有循环的解决方案来优化它一次(而不是我想添加的每列一次)。

在其他答案中,我看到了对 assign() 的引用功能,它确实支持一次添加多个列。我尝试通过以下方式使用它:

# WARNING: this does NOT work
df = df.assign(
NewColumn1=lambda row: compute_new_column1_value(row),
NewColumn2=lambda row: compute_new_column2_value(row),
# more lines like the two above
)

这不起作用的原因是因为 lambda 实际上根本不接收数据帧的行作为参数,它们似乎只是一次获得整个数据帧。然后期望每个 lambda 一次返回一个完整的列/系列/值数组。所以,我的问题是,我最终必须自己在那些 lambda 表达式中的所有循环中实现手动循环,这显然对性能来说会更糟。

我可以从概念上想到两个解决方案,但到目前为止还无法找到如何实际实现它们:

  1. 类似于 df.assign()(支持一次添加多个列),但能够将行传递到 lambda 而不是完整的数据帧

  2. 一种矢量化我的 compute_new_columnX_value() 函数的方法,以便它们可以按照 df.assign() 期望的方式用作 lambda使用。

到目前为止,我对第二种解决方案的问题是我的一些函数的基于行的版本如下所示,我很难找到如何正确地向量化它们:

def compute_new_column1_value(row):
if row["SomeExistingColumn"] in some_dictionary:
return some_dictionary[row["SomeExistingColumn"]]
else:
return some_default_value

最佳答案

您是否尝试过将列初始化为 nan,逐行遍历数据帧,并使用 loc 分配值?

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(0, 20, (10, 5)))

df[5] = np.nan
df[6] = np.nan

for i, row in df.iterrows():
df.loc[i, 5] = row[1] + row[4]
df.loc[i, 6] = row[3] * 2

print(df)

产量

    0   1   2   3   4
0 17 4 3 11 10
1 16 1 14 11 16
2 4 18 12 19 7
3 11 3 7 10 5
4 11 0 10 1 17
5 5 17 10 3 8
6 0 0 7 3 6
7 7 18 18 13 8
8 16 4 12 11 16
9 13 9 15 8 19

0 1 2 3 4 5 6
0 17 4 3 11 10 14.0 22.0
1 16 1 14 11 16 17.0 22.0
2 4 18 12 19 7 25.0 38.0
3 11 3 7 10 5 8.0 20.0
4 11 0 10 1 17 17.0 2.0
5 5 17 10 3 8 25.0 6.0
6 0 0 7 3 6 6.0 6.0
7 7 18 18 13 8 26.0 26.0
8 16 4 12 11 16 20.0 22.0
9 13 9 15 8 19 28.0 16.0

关于python - 如何使用依赖于其他列的值有效地将多列添加到 pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48344958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com