否定 pandas isna 函数返回 -2

negating pandas isna function returning -2

提问人:Gerry 提问时间:4/19/2022 最后编辑:Gerry 更新时间:12/7/2022 访问量:754

问:

我对不同环境中工作方式的不一致感到有些困惑。关于为什么布尔值在数字设置中不起作用的任何想法:pd.isna()~pd.isna

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame({'p':['a', 'b', 'c'], 'q':[1, np.nan, 2]})
>>> df
   p    q
0  a  1.0
1  b  NaN
2  c  2.0
>>> df[~pd.isna(df['q'])]       # THIS WORKS AS EXPECTED.
   p    q
0  a  1.0
2  c  2.0
>>> pd.isna(np.nan)
True
>>> not pd.isna(np.nan)
False                           # THIS WORKS AS EXPECTED.
#### So far so good ####
>>> ~pd.isna(np.nan)
-2                              # I WAS EXPECTING False HERE.
>>> ~(pd.isna(np.nan))
-2                              # I WAS EXPECTING False HERE.

我不是为什么最后两行 fetch 而不是 .-2False

python-3.x 数据帧 布尔逻辑

评论

0赞 Daniel me 4/19/2022
我不够熟悉,不知道为什么你的编译器没有像我预期的那样显示对象。
0赞 Gerry 4/19/2022
谢谢@Danielme它怎么会与df[~pd.isna(df['q'])]
0赞 Daniel me 4/19/2022
我们知道 ~pd.isna(df['q']) 按位返回 'q' 过滤的 isnan,因为它已经是一个布尔类型,我们在一位布尔上得到按位(所以翻转 t/f)。所以我们有一个带有布尔值的数组。如果您不知道,我们可以传递 df[[True,False,False]] 以仅打印数据集的第一行。isna 的返回正在做同样的事情,基本上只显示非 nan 值。您正在为每个索引传递一个布尔值来保存。我删除了我的第一条评论,因为它不正确
0赞 Gerry 4/19/2022
谢谢@Danielme。所以基本上你在说,也是.然而~np.array([True]) = array([False]) ~pd.Series([True]) = 0 False dtype:bool~True = -2

答:

1赞 Javad 4/19/2022 #1

这不是关于您使用的最后两行,即按位非运算符,它反转了对象的所有位,二进制不是 for (int 中的 1) 是 -2:pd.isna()~True

>>> var = int(True)
>>> var
1
>>> not var
False
>>> ~ var
-2

python 中的 True 和 False 等布尔值是从比较中返回的,python 中的逻辑运算符和成员运算符以及按位运算符返回 int 值。

评论

0赞 Gerry 4/19/2022
谢谢@JavadNikbakht。我仍然很好奇为什么这个相同的按位非运算符在倒数第五行工作,即df[~pd.isna(df['q'])]