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

本是古典 何须时尚 2022-05-16 06:35 574阅读 0赞

(作者:陈玓玏)

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

一、Pandas中空值的显示

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

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

  1. import pandas as pd
  2. arr = pd.read_excel('C:/Users/cdl/Desktop/空值test.xlsx',encoding='gbk')
  3. print(arr)
  4. print(arr.dtypes)
  5. arr = pd.read_excel('C:/Users/cdl/Desktop/空值test_1.xlsx',encoding='gbk')
  6. arr['strTest_1'] = arr['strTest'].apply(lambda x:str(x))
  7. print(arr)
  8. print(arr.dtypes)

结果:

  1. numTest timeTest strTest
  2. 0 1 2017-08-10 00:00:00 one
  3. 1 2 2018-08-10 00:00:00 two
  4. 2 NaN 2019-08-10 00:00:00 NaN
  5. 3 3 NaN three
  6. 4 NaN NaN four
  7. 5
  8. 6 4 2020-08-10 00:00:00 NaN
  9. numTest object
  10. timeTest object
  11. strTest object
  12. dtype: object
  13. numTest timeTest strTest strTest_1
  14. 0 1.0 2017-08-10 one one
  15. 1 2.0 2018-08-10 two two
  16. 2 NaN 2019-08-10 NaN nan
  17. 3 3.0 NaT three three
  18. 4 NaN NaT four four
  19. 5 4.0 2020-08-10 NaN nan
  20. numTest float64
  21. timeTest datetime64[ns]
  22. strTest object
  23. strTest_1 object
  24. 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。
判断数值型:

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

输出结果都是:

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

判断时间型:

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

输出结果都是:

  1. numTest timeTest strTest strTest_1
  2. 3 3.0 NaT three three
  3. 4 NaN NaT four four

判断字符串型:

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

输出结果:

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

判断更改类型后的列:

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

输出结果:

  1. numTest timeTest strTest strTest_1
  2. 2 NaN 2019-08-10 NaN nan
  3. 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,所以不能用常规方法判断了,直接判断字符串是否相等即可。

发表评论

表情:
评论列表 (有 0 条评论,574人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MySQL数据类型 -- 数值

    在MySQL关系型数据库中,MySQL支持的数据类型非常丰富。它主要分为3大类,即:数值型,日期时间性,字符型。而实际上这三类数据类型可以进一步的细分扩展,可以根据业务需要选择