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,所以不能用常规方法判断了,直接判断字符串是否相等即可。
还没有评论,来说两句吧...