python2与python3中关于对NaN类型数据的判断和转换

今天在对一堆新数据进行数据清洗的时候,遇到了一个这样的问题:python

ValueError: cannot convert float NaN to integer

一开始是这样的,我用的jupyter是python35的,使用DataFrame读入了数据,其中有一列是year,默认读入时是将year这一列转换为了float,因此就有了这样的现象:app

年份都是float类型了,看得我强迫症都犯了。因而经过这样的代码来进行强转,因而就报了上面的错误了。spa

df.year = [int(y) for y in df.year]

简单描述一下问题,其实就是NaN在python35中没法被强转。code

首先说一下,NaN类型在python25中在强转int的时候默认是转换为0的,而在python25以后的版本再进行转换的时候就会报以上的错误。对象

咱们先打印看一下np.nan的类型:blog

print(type(np.nan))
<type 'float'>

np.nan是float类型,可是在进行int转换的时候就会报错。字符串

解决方法:class

使用is或者==进行判断是否是NaN,不是NaN进行强转int,是则用0代替。变量

先说一下==和is使用时的区别:float

is和==都是对对象进行比较判断做用的,但对对象比较判断的内容并不相同。

若是有a跟b两个变量,只有数值型和字符串型的状况下,a is b才为True,当a和b是tuple,list,dict、set或者是实例化对象时,a is b为False。

==是python标准操做符中的比较操做符,用来比较判断两个对象的value(值)是否相等。


经过下面的代码能够看出,np.nan==np.nan结果是False,可是np.nan is np.nan倒是True。

a = np.nan


print(a == np.nan)
print(a == a)
print(a is np.nan)
print(a is a)


False
False
True
True

所以,经过每一个元素与自身比较就能够解决了,代码以下:

year = []
for y in df.year:
    if y == y:
        year.append(int(y))
    else:
        year.append(0)