查找列列表中行中的 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
所以你不需要在 NumPy
和 Pandas
之间转换(如果你的数据帧真的很长,可能有助于提高速度):
df["Q"] = (df.max(axis=1) >= df["Close"] + 0.3).astype(int)
它在每一行中找到最大值并查看它是否大于要求的值。如果最大值不够大,则该行中的任何值都不会。它利用了这样一个事实,即您实际上不需要计算一行中大于 df["Close"] + 0.3
的元素的数量;你只需要知道是否至少有1个元素满足条件。
然后它使用 astype(int)
.
将 True
和 False
答案转换为 1
和 0
我刚开始使用 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
所以你不需要在 NumPy
和 Pandas
之间转换(如果你的数据帧真的很长,可能有助于提高速度):
df["Q"] = (df.max(axis=1) >= df["Close"] + 0.3).astype(int)
它在每一行中找到最大值并查看它是否大于要求的值。如果最大值不够大,则该行中的任何值都不会。它利用了这样一个事实,即您实际上不需要计算一行中大于 df["Close"] + 0.3
的元素的数量;你只需要知道是否至少有1个元素满足条件。
然后它使用 astype(int)
.
True
和 False
答案转换为 1
和 0