Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 逻辑参数不起作用(和/或)_Python_Pandas_Logic - Fatal编程技术网

Python 逻辑参数不起作用(和/或)

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

我构建以下玩具代码来说明我的问题。 我有一些权重,需要选择特定的组合。这可以是掩码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 = 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]