从pandas dataFrame中删除NaNs

时间:2013-07-31 12:03:54

标签: python pandas dataframe nan

我不明白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()

返回了预期的结果。有人可以解释这里发生了什么吗?

2 个答案:

答案 0 :(得分:15)

您应该使用isnullnotnull来测试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).