Python Pandas ~ != 和 == 之间布尔索引的差异

问题描述 投票:0回答:1

我对 != 之后使用 ~ 与仅使用 == 时布尔索引的不同结果感到困惑

我有一个有 4 列的 pandas df:

dic = {
    "a": [1,1,1,0,0,1,1],
    "b": [0,0,1,1,0,0,0],
    "c": [1,0,1,0,0,1,0],
    "d": [0,0,1,0,0,1,0],
}

df = pd.DataFrame(data=dic)

print(df)

   a  b  c  d
0  1  0  1  0
1  1  0  0  0
2  1  1  1  1
3  0  1  0  0
4  0  0  0  0
5  1  0  1  1
6  1  0  0  0

我想对整个 df 数据帧进行子集化: 我想删除所有元素为零的所有行,但仅在 b c d 列上,而不是 a 上。

如果我在 == 之后使用 ~(非)运算符,我会得到所需的结果:

names = ["b","c","d"]

df_A = df.loc[~(df[names] == 0.0).all(axis=1)]

print(df_A)

   a  b  c  d
0  1  0  1  0
2  1  1  1  1
3  0  1  0  0
5  1  0  1  1

但是当我只使用 == 时,我得到不同的结果:

names = ["b","c","d"]

df_B = df.loc[(df[names] != 0.0).all(axis=1)]

print(df_B)

   a  b  c  d
2  1  1  1  1

您知道为什么会出现这种情况吗?这两个应该不一样吧?

谢谢你。

python pandas indexing boolean
1个回答
0
投票

您没有正确遵循德摩根定律

如果使用相反的条件作为输入,则必须将

all
替换为
any

df_B = df.loc[(df[names] != 0.0).any(axis=1)]

输出:

   a  b  c  d
0  1  0  1  0
2  1  1  1  1
3  0  1  0  0
5  1  0  1  1
© www.soinside.com 2019 - 2024. All rights reserved.