从pandas dataFrame中删除NaN

ido*_*oda 7 python nan dataframe pandas

我不明白NaN是如何在熊猫中对待的,会很乐意得到一些解释,因为逻辑似乎对我"破碎".

我有一个csv文件,我使用read csv加载.我在该文件中有一个"注释"列,大多数时候都是空的.

我已经隔离了该列,并尝试了不同的方法来删除空值.首先,当我写作:

0       VP
1       VP
2       VP
3     TEST
4      NaN
5      NaN
....
Run Code Online (Sandbox Code Playgroud)

我明白了:

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!!!
Run Code Online (Sandbox Code Playgroud)

该列的其余部分是NaN.所以pandas将空条目加载为NaN.到目前为止很棒.现在我试图删除这些条目.我尝试过:

0       VP
1       VP
2       VP
3     TEST
4      NaN
5      NaN
....
Run Code Online (Sandbox Code Playgroud)

并收到同一列.没有什么被丢弃.困惑,我试图理解为什么没有丢弃,所以我尝试:

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!!!
Run Code Online (Sandbox Code Playgroud)

并收到了一系列法利斯.没有什么是NaNs ......令人困惑.然后我试过:

0       VP
1       VP
2       VP
3     TEST
4      NaN
5      NaN
....
Run Code Online (Sandbox Code Playgroud)

而且,除了愚蠢之外别无他物.我在那里有点生气,并且认为更聪明.所以我做了:

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!!!
Run Code Online (Sandbox Code Playgroud)

啊,得到了!所以我现在尝试过:

0       VP
1       VP
2       VP
3     TEST
4      NaN
5      NaN
....
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,仍然所有的结果都是法利斯!唯一有效的是:

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!!!
Run Code Online (Sandbox Code Playgroud)

它回归了预期的结果.谁能解释一下这里发生了什么?

And*_*den 15

您应该使用isnullnotnull测试NaN(这些使用pandas dtypes比numpy更强大),请参阅文档中的"缺少值".

dropna在列上使用Series方法不会影响原始数据帧,但可以执行您想要的操作:

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
Run Code Online (Sandbox Code Playgroud)

数据帧的方法有一个子集的参数(丢弃具有的NaN在特定列的行):dropna

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

In [14]: df = df.dropna(subset=['comments'])
Run Code Online (Sandbox Code Playgroud)


Suk*_*lra 7

您需要NaN使用math.isnan()函数(Or numpy.isnan)进行测试.无法使用相等运算符检查NaN.

>>> a = float('NaN')
>>> a
nan
>>> a == 'NaN'
False
>>> isnan(a)
True
>>> a == float('NaN')
False
Run Code Online (Sandbox Code Playgroud)

帮助功能 - >

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

    Check if float x is not a number (NaN).
Run Code Online (Sandbox Code Playgroud)