numpy.where 是否并行更改所有值?

问题描述 投票:0回答:1

我有一个像这样的 pandas 数据框:

              value           some other cond

0              0                      true
1              1                      true
2              0                      true
3              1                      true
4              1                      true
5              0                      false

所以我想将此更改应用于“值”列:

如果先前的行值为零并且其他一些条件为真,则将当前行值更改为零,否则保持不变。

首先我尝试使用 np.where 进行矢量化,如下所示:

import pandas as pd
import numpy as np

df["value"] = np.where((df["value].shift(1) == 0) & (df"Some Other Cond" == "true",
    0, df["value"])

并将值更改为:

              value          new value

0              0                0

1              1                -> 0 ( Correct)

2              0                0

3              1                -> 0 ( Correct)

4              1                -> 1 ( Unchanged! even though it should change to 0)

5              0                0

如您所见,numpy.where 方法有点并行适用于所有单元格。它不是从上开始,然后一排一排地下来,不是这样工作的。因此,它并不像我预期的那样工作。

所以我被迫循环遍历整个“值”列以应用我想要的更改。像这样:

import pandas as pd
import numpy as np

for i in range(1, len(df.index)):
    if (df.at[i - 1, 'value'] == 0) and (df.at[i, 'Some other cond'] == 'true'):
        df.at[i, 'value'] = 0

所以这确实解决了我的问题,但显然,循环整个数据帧太慢了。将此循环添加到我的代码中,将运行时间长度从 10 秒增加到 2 分钟!几乎 12 倍。

所以我的问题是:

如果没有 for 循环,我应该如何做到这一点?有可能吗?

如果没有,我怎样才能加快循环速度?

提前致谢!

python pandas dataframe for-loop vectorization
1个回答
0
投票

考虑在代码中实现一个单独的标志变量,当值更改为 0 时设置为 true,当值未更改时设置为 false。这样您就可以检查标志而不是先前的值,该值可能还没有时间更改,也可能没有时间更改。

© www.soinside.com 2019 - 2024. All rights reserved.