(作者:陈玓玏)

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

一、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,所以不能用常规方法判断了,直接判断字符串是否相等即可。

Logo

长江两岸老火锅,共聚山城开发者!We Want You!

更多推荐