为什么测试 `NaN == NaN` 不能用于从 pandas 数据框中删除?

7
请解释一下pandas如何处理NaN,因为以下逻辑对我来说似乎是“有问题的”。我尝试了各种方法(如下所示)来删除空值。
我的数据框,使用read.csv从CSV文件中加载,具有一个名为“comments”的列,大部分时间为空。
列“marked_results.comments”看起来像这样;其余的所有列都是NaN,因此pandas将空条目加载为NaN,到目前为止还好。
0       VP
1       VP
2       VP
3     TEST
4      NaN
5      NaN
....

现在我试图删除这些条目,只有这种方法可行:

  • marked_results.comments.isnull()

以下所有方法都不起作用:

  • marked_results.comments.dropna() 只会返回相同的列,没有任何条目被删除,令人困惑。
  • marked_results.comments == NaN 只会返回一个全是False的序列。没有NaNs...令人困惑。
  • 同样地,marked_results.comments == nan

我还尝试了:

comments_values = marked_results.comments.unique()

array(['VP', 'TEST', nan], dtype=object)

# Ah, gotya! so now ive tried:
marked_results.comments == comments_values[2]
# but still all the results are Falses!!!

2
NaN != NaN - 阅读Stephen Canon的被接受的回答。 - fvu
2个回答

15
你应该使用 isnullnotnull 来测试 NaN(这些比numpy更强大,适用于pandas数据类型),请参见文档中的 "值视为缺失"
在列上使用 Series 方法 dropna 不会影响原始数据帧,但是可以根据需求进行操作:
In [11]: df
Out[11]:
  comments
0       VP
1       VP
2       VP
3     TEST
4      NaN
5      NaN

In [12]: df.comments.dropna()
Out[12]:
0      VP
1      VP
2      VP
3    TEST
Name: comments, dtype: object

dropna 方法是 DataFrame 对象的一种方法,其有一个 subset 参数(用于删除特定列中包含 NaN 的行):

In [13]: df.dropna(subset=['comments'])
Out[13]:
  comments
0       VP
1       VP
2       VP
3     TEST

In [14]: df = df.dropna(subset=['comments'])

7

您需要使用math.isnan()函数(或者numpy.isnan)来测试NaN值。无法使用等号运算符来检查NaN。

>>> a = float('NaN')
>>> a
nan
>>> a == 'NaN'
False
>>> isnan(a)
True
>>> a == float('NaN')
False

帮助函数 ->

isnan(...)
    isnan(x) -> bool

    Check if float x is not a number (NaN).

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接