添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

(作者:陈玓玏)

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

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

实际项目有这样的需求,将某一列的值,映射成类别数据,这个时候,需要我们将范围等频切分,或者等距切分。 具体的做法可以先看某一些特征的具体分布情况,然后我们选择合适的阈值进行分割。 def age_map(x): if x < 26>=26 and x <= 35: return 1 elif x > 35 and x <= 45: return 2 elif pd.isnull(x): #判断是否为NaN值,== 和in 都无法判断 return 3 else: return 4 也就是用pandas自带的函数来表示: 2.series和dataframe不一样,条件判断时直接“ series == 某值 ”获得所有索引,而dataframe需要dataframe['列名' ] == 某值 或“ dataframe.列名 == 某值 ”,来获得索引。print( df_2[ s_1 == False ] ) #得到series等于False的行索引,就可以用另一个表格通过这个索引值来操控其他需要的表格如df_2了。1.判断某列为空值,用pd.isna(df['列名'])方法,获得数据为True和False的series。 pandas基于numpy,所以其空值nan和numpy.nan是等价的。numpy的nan并不是空对象,其实际上是numpy.float64对象,所以我们不能误认为其是空对象,从而用bool(np.nan)去判断是否为空值,这是不对的。 对于pandas空值,我们该如何判断,并且有哪些我们容易掉进去的陷阱,即不能用怎么样的方式去判断呢? 可以判断pand...... 在pandas,如果需要查看column的类型,一般使用 df.dtypes方法,它将返回每个列的数据类型。但实践,有时会出现需要包含多种数据类型的场景,或者dataFrame包含的表格出错,出现了多种数据类型。为了观察dataFrame的所有类型在列的分布情况,我们写了对应的检查函数。 df.isna():与 df.isnull() 等价。 df.notnull():与 df.isnull() 相反,返回一个布尔类型数据框,表示各个位置是否不是空值。 import pandas as pd df = pd.DataFrame({'A': ... dates = pd.date_range("20200307", periods=4) df1 = pd.DataFrame(np.arange(12).reshape(4, 3), index=dates, columns=["A", "B", "C"]) df2 = pd.Da... 有时我们用pandas读取Excel去获取某列或者某几列的值,并需要对该列的值进行处理,首先要判断该列是否有空值,若有空值不做判断可能程序会报错,比如用正则表达式去匹配该列的所有单元格的值,这时若某个单元格为空值则会报错。 我们可以将空值找出,并做判断,若不为空再进行匹配; 正常情况pandas读取的空值都会显示NaN,若我们用df[i] == np.nan 去判断这显示为False,i这里代表索引。达不到我们想要的目的,建议用df.isnull()进行判断。 这里我们知道第二行