我对 != 之后使用 ~ 与仅使用 == 时布尔索引的不同结果感到困惑
我有一个有 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
您知道为什么会出现这种情况吗?这两个应该不一样吧?
谢谢你。
您没有正确遵循德摩根定律。
如果使用相反的条件作为输入,则必须将
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