我有一个像这样的 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 循环,我应该如何做到这一点?有可能吗?
如果没有,我怎样才能加快循环速度?
提前致谢!
考虑在代码中实现一个单独的标志变量,当值更改为 0 时设置为 true,当值未更改时设置为 false。这样您就可以检查标志而不是先前的值,该值可能还没有时间更改,也可能没有时间更改。