Pandas中空值的判断方法,包括数值型、字符串型、时间类型等

(作者:陈玓玏)

数据处理的过程中经常会遇到空值,但是不同的语言对空值的处理好像是各有不同的,而这些处理结果会对我们的建模和统计造成很重要的影响,可能会造成各种错误,所以有必要好好研究一下。

一、Pandas中空值的显示

先来看两个文件的内容:
这是文件C:/Users/cdl/Desktop/空值test.xlsx的内容

这里写图片描述
这是文件C:/Users/cdl/Desktop/空值test_1.xlsx的内容
这里写图片描述
这两个文件的内容只有一行之差,也就是test比test_1多了一行我手动输入的空格。那么我们分别获取这两个文件,会有以下区别:

import pandas as pd

arr = pd.read_excel('C:/Users/cdl/Desktop/空值test.xlsx',encoding='gbk')
print(arr)
print(arr.dtypes)

arr = pd.read_excel('C:/Users/cdl/Desktop/空值test_1.xlsx',encoding='gbk')
arr['strTest_1'] = arr['strTest'].apply(lambda x:str(x))
print(arr)
print(arr.dtypes)

结果:

 numTest             timeTest strTest
0       1  2017-08-10 00:00:00     one
1       2  2018-08-10 00:00:00     two
2     NaN  2019-08-10 00:00:00     NaN
3       3                  NaN   three
4     NaN                  NaN    four
5                                     
6       4  2020-08-10 00:00:00     NaN
numTest     object
timeTest    object
strTest     object
dtype: object
   numTest   timeTest strTest strTest_1
0      1.0 2017-08-10     one       one
1      2.0 2018-08-10     two       two
2      NaN 2019-08-10     NaN       nan
3      3.0        NaT   three     three
4      NaN        NaT    four      four
5      4.0 2020-08-10     NaN       nan
numTest             float64
timeTest     datetime64[ns]
strTest              object
strTest_1            object
dtype: object

我们来总结一下区别:
1、不加入空格时,numTest列被读为float型,timeTest被读为datetime64型,而加入了空格后,统一解读为object型。
2、不加入空格时,numTest和strTest中的缺失值默认为NaN,而时间则为NaT,而加了空格后,缺失值统一为NaN。
3、在Pandas中的空值显示为NaN,而numpy中为nan,这个从strTest_1这一列和strTest的区别可以看出来。
4、当时间识别为datetime64类型时,其格式就是输入的格式,但其识别为字符串时,格式会统一加上时分秒。
二 、Pandas中空值的判断

这里用到的对象是不含空格输入的DataFrame。
判断数值型:

print(arr[pd.isna(arr['numTest'])==True])
print(arr[pd.isnull(arr['numTest'])==True])
print(arr[np.isnan(arr['numTest'])==True])
# print(arr[np.isnat(arr['numTest'])==True])  #这一句报错:TypeError: ufunc 'isnat' is only defined for datetime and timedelta.

输出结果都是:

numTest   timeTest strTest strTest_1
2      NaN 2019-08-10     NaN       nan
4      NaN        NaT    four      four

判断时间型:

print(arr[pd.isna(arr['timeTest'])==True])
print(arr[pd.isnull(arr['timeTest'])==True])
# print(arr[np.isnan(arr['timeTest'])==True])  #这一句报错:TypeError: ufunc 'isnan' not supported for the input types
print(arr[np.isnat(arr['timeTest'])==True])
# print(arr[arr['timeTest']==pd.NaT])  #这一句返回空的DataFrame

输出结果都是:

numTest timeTest strTest strTest_1
3      3.0      NaT   three     three
4      NaN      NaT    four      four

判断字符串型:

print(arr[pd.isna(arr['strTest'])==True])
print(arr[pd.isnull(arr['strTest'])==True])
# print(arr[np.isnan(arr['strTest'])==True])  #这一句报错:TypeError: ufunc 'isnan' not supported for the input types
# print(arr[np.isnat(arr['strTest'])==True])  #这一句报错:TypeError: ufunc 'isnat' is only defined for datetime and timedelta

输出结果:

numTest   timeTest strTest strTest_1
2      NaN 2019-08-10     NaN       nan
5      4.0 2020-08-10     NaN       nan

判断更改类型后的列:

# print(arr[pd.isna(arr['strTest'])==True])  #这一句返回空的DataFrame
# print(arr[pd.isnull(arr['strTest_1'])==True])  #这一句返回空的DataFrame
# print(arr[np.isnan(arr['strTest_1'])==True])  #这一句报错:TypeError: ufunc 'isnan' not supported for the input types
# print(arr[np.isnat(arr['strTest_1'])==True])  #这一句报错:TypeError: ufunc 'isnat' is only defined for datetime and timedelta
# print(arr[arr['strTest_1']==np.nan])  #这一句返回空的DataFrame
print(arr[arr['strTest_1']=='nan'])

输出结果:

numTest   timeTest strTest strTest_1
2      NaN 2019-08-10     NaN       nan
5      4.0 2020-08-10     NaN       nan

通过以上的实验,我们可以知道:
1、判断数值是否为空,可以用pd.isna,pd.isnull,np.isnan;
2、判断字符串是否为空,可以用pd.isna,pd.isnull;
3、判断时间是否为空,可以用pd.isna,pd.isnull,np.isnat;
4、判断转换类型后的字符串,空值也转换成了字符串nan,所以不能用常规方法判断了,直接判断字符串是否相等即可。

  • 23
    点赞
  • 111
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值