我不明白NaN是如何在熊猫中对待的,会很乐意得到一些解释,因为逻辑似乎对我“破碎”。
我有一个csv文件,我使用read csv加载。我在该文件中有一个“注释”列,大多数时候都是空的。
我已经隔离了该列,并尝试了不同的方法来删除空值。首先,当我写作:
marked_results.comments
我明白了:
0 VP
1 VP
2 VP
3 TEST
4 NaN
5 NaN
....
该列的其余部分是NaN。 所以pandas将空条目加载为NaN。到目前为止很棒。 现在我试图删除这些条目。我尝试过:
marked_results.comments.dropna()
并收到同一栏目。没有什么被丢弃。困惑,我试图理解为什么没有丢弃,所以我尝试了:
marked_results.comments==NaN
并收到了一系列法利斯。没有什么是NaNs ......令人困惑。 然后我试了一下:
marked_results.comments==nan
再一次,只有愚蠢。我在那里有点生气,并且认为更聪明。所以我做了:
In [71]:
comments_values = marked_results.comments.unique()
comments_values
Out[71]:
array(['VP', 'TEST', nan], dtype=object)
啊,得到了!所以我现在尝试过:
marked_results.comments==comments_values[2]
并且令人惊讶的是,仍然所有结果都是Falses! 唯一有效的是:
marked_results.comments.isnull()
返回了预期的结果。有人可以解释这里发生了什么吗?
答案 0 :(得分:15)
您应该使用isnull
和notnull
来测试NaN(使用pandas dtypes比使用numpy更强大),请参阅"values considered missing" in the docs。
在列上使用系列方法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 方法有一个子集参数(用于删除特定列中包含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'])
答案 1 :(得分:7)
您需要使用NaN
函数(或math.isnan()
)测试numpy.isnan
。无法使用相等运算符检查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).