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

yipeiwu_com7年前Python基础

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

ValueError: cannot convert float NaN to integer 

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

python2 python3 对NaN类型数据的判断和转换

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

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

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

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

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

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

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

解决方法:

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

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

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)

以上这篇python2与python3中关于对NaN类型数据的判断和转换方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

python 实现创建文件夹和创建日志文件的方法

一、实现创建文件夹和日志 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author: nulige import os import...

Django工程的分层结构详解

Django工程的分层结构详解

前言 传统上我们都知道在Django中的MTV模式,具体内容含义我们再来回顾一下: M:是Model的简称,它的目标就是通过定义模型来处理和数据库进行交互,有了这一层或者这种类型的对象...

python中WSGI是什么,Python应用WSGI详解

为了让大家更好的对python中WSGI有更好的理解,我们先从最简单的认识WSGI着手,然后介绍一下WSGI几个经常使用到的接口,了解基本的用法和功能,最后,我们通过实例了解一下WSGI...

Python编程实现正则删除命令功能

本文实例讲述了Python编程实现正则删除命令功能。分享给大家供大家参考,具体如下: 脚本用途: 在DOS下使用del功能箭头,不支持正则表达式的功能。 脚本实现: import s...

Python网络编程详解

1、服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多请求。 2、客户端/服务器架...