查找列列表中行中的 1 个值是否大于阈值的矢量化方法

Vectorized way to find if 1 value in row from list of columns is greater than threshold

我刚开始使用 np.where(),所以我当然尝试使用我的新玩具来解决这个问题。但是没用。

我有一个数据框。

Close  M    N    O    P
0.1   0.2  0.3  0.4  0.5
0.2   0.1  0.6  0.1  0.0

Colslist = [M,N,O,P] 

我想要一个名为 Q 的新列,其中包含此公式的结果。我想出的公式是:

df["Q"] = np.where(df[Colslist] >= (Close + 0.3), 1,0)

两行的输出均为 1。第0行有2个值大于,第1行有1个值大于。

我认为我写的问题是它要求所有值都大于输出 1。

所以我需要的是 Q 列中的 1,如果列列表的该行中有一个值大于等于同一行的收盘价 + 0.3。

执行此操作的最佳矢量化方法是什么?

问题是坐标轴与您的情况不匹配。

的输出
df[Colslist] >= (df['Close'] + 0.3)

       M      N      O      P      0      1
0  False  False  False  False  False  False
1  False  False  False  False  False  False

这没有意义。

您可以使用 ge 方法来确保您将 Colslist 中的值与“关闭”列值进行比较。所以结果:

df[Colslist].ge(df['Close'] + 0.3, axis=0)

       M      N      O      P
0  False  False   True   True
1  False   True  False  False

现在,由于您的条件是如果一行中至少有一个 True 则为 True,因此您可以在 axis=1 上使用 any。然后是最终代码:

Colslist = ['M','N','O','P'] 
df["Q"] = np.where(df[Colslist].ge(df['Close'] + 0.3, axis=0).any(axis=1), 1,0)

输出:

   Close    M    N    O    P  Q
0    0.1  0.2  0.3  0.4  0.5  1
1    0.2  0.1  0.6  0.1  0.0  1

这里有一个 one-liner 和纯 Pandas 所以你不需要在 NumPyPandas 之间转换(如果你的数据帧真的很长,可能有助于提高速度):

df["Q"] = (df.max(axis=1) >= df["Close"] + 0.3).astype(int)

它在每一行中找到最大值并查看它是否大于要求的值。如果最大值不够大,则该行中的任何值都不会。它利用了这样一个事实,即您实际上不需要计算一行中大于 df["Close"] + 0.3 的元素的数量;你只需要知道是否至少有1个元素满足条件。

然后它使用 astype(int).

TrueFalse 答案转换为 10