Python 逻辑参数不起作用(和/或)
我构建以下玩具代码来说明我的问题。 我有一些权重,需要选择特定的组合。这可以是掩码1中的一个权重=1,也可以是某些权重组合应用于mask2。但是,遮罩2至少在第二部分不起作用。 举例说明:由于mask1,在特定列中只应保留权重为1的行。 但是,输出还提供了不应该存在的行,例如行1,因为SUMBCD始终为1,请参见下文Python 逻辑参数不起作用(和/或),python,pandas,logic,Python,Pandas,Logic,我构建以下玩具代码来说明我的问题。 我有一些权重,需要选择特定的组合。这可以是掩码1中的一个权重=1,也可以是某些权重组合应用于mask2。但是,遮罩2至少在第二部分不起作用。 举例说明:由于mask1,在特定列中只应保留权重为1的行。 但是,输出还提供了不应该存在的行,例如行1,因为SUMBCD始终为1,请参见下文 import numpy as np import pandas as pd # random dataframe: np.random.seed(seed=1) df = p
import numpy as np
import pandas as pd
# random dataframe:
np.random.seed(seed=1)
df = pd.DataFrame(np.random.randint(0,5000,size=(2000, 4)), columns=list('ABCD'))
columns = list(df.columns)
for col in columns: # round up at certain threshold, to simulate weightings of 1
other_columns = [x for x in columns if not x == col]
df.loc[df[col] > 4700, col] = 5000
df.loc[df[col] == 5000, other_columns] = 0
# calculate weights:
df[list(df.columns)] = df.div(df[["A", "B", "C", "D"]].sum(axis=1), axis="index")
df["sumABCD"] = df[["A", "B", "C", "D"]].sum(axis=1)
# filter
mask1 = ((df[["A", "B", "C", "D"]] == 1).any(axis=1))
for x in [0, 0.10]:
mask2 = ((df["B"] <= x) & (df["sumABCD"] < 1.0))
test = df[mask1 | mask2]
print(test.head(20))
A B C D sumABCD
1 0.287745 0.014313 0.419938 0.278004 1.0
3 0.000000 0.000000 0.000000 1.000000 1.0
8 0.000000 0.000000 1.000000 0.000000 1.0
12 1.000000 0.000000 0.000000 0.000000 1.0
编辑:
对于第1行问题上更新的问题,请尝试对数据运行下面的命令
df.loc[df["sumABCD"] < 1.0, "sumABCD"].map('{0:.30f}'.format)
Out[28]:
1 0.999999999999999888977697537484
13 0.999999999999999888977697537484
44 0.999999999999999888977697537484
53 0.999999999999999888977697537484
57 0.999999999999999888977697537484
由于df[SUMBCD]<1.0始终为假,mask2始终为假
但是,您可以在|运算符上切片df,如中所示
test = df[mask1 | mask2]
因此,mask2 all False不会影响结果。当mask2全部为假时,结果取决于mask1。这就是“|”运算符的性质。因此,测试将取决于mask1的正确/错误。这就是为什么测试不像您期望的那样是空数据帧。谢谢您的回答。我更新了一下这个问题。更重要的是,mask2确实应该为false,但我仍然得到mask1和mask2为false的行。请参见上文。@user27074:df[sumgabcd]第1行的值不是1.0,因为在除法后浮点值的精度降低。我编辑了答案,添加了更多的解释。请检查已编辑的文档。
test = df[mask1 | mask2]