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
您应该使用isnull
和notnull
测试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)
您需要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)