1,Pandas的缺失值
Pandas选用标签方法表示缺失值,包括两种python原有的缺失值:浮点数据类型的NaN值,以及python的None对象。
1.1 None:python对象类型的缺失值
Pandas可以使用的第一种缺失值标签是None,它是一个Python单体对象,经常在代码中表示缺失值。由于None是一个Python对象,
所以不能作为NumPy/Pandas数组类型的缺失值,只能用于object数组类型。
这里的dtype=object表示NumPy认为由于这个数组是Python对象构成的,因此将其类型判断为object。
使用Python对象构成的数组意味着如果对一个包含None的数组进行累积操作,如果sum()或者min(),那么通常会出现类型错误:
这就是说,在Python中没有定义整数与None之间的加法运算。
1.2 NaN : 数值类型的缺失值
另一种缺失值的标签是NaN(全称Not a Number:不是一个数字),是一种在任何系统中都兼容的特殊浮点数。
可以把NaN看作是一个数据病毒---->它会将与接触过的数据同化,即无论和NaN进行何种操作,最终结果都是NaN:
这样的操作结果虽然定义合理,但是难免会造成一些困扰
为此NumPy也提供了一些特殊的累计函数,它们可以忽略缺失值的影响
需谨记,NaN是一种特殊的浮点数,不是整数、字符串等其它数据类型。
1.3,Pandas中NaN与None的差异
虽然NaN与None各有各的用处,但是Pandas把它们看成是可以等价交换的,在适当的时候会将两者进行替换
Pands会将没有标签值得数据类型自动转换为NA,例如,当我们将整形数据中的一个值设置为np.nan时,这个值就会强制转换为浮点数缺失值NA。
2 处理缺失值
Pandas提供了一些方法来发现,剔除,替换数据结构中的缺失值:
isnull() : 创建一个布尔类型的掩码标签缺失值
notnull() : 与isnull相反
dropna() : 返回一个剔除缺失值的数据
fillna() : 返回一个填充了缺失值的数据副本。
2.1 发现缺失值
Pandas数据结构有两种有效的方法发现缺失值:isnull()和notnull(),每种方法都返回布尔类型的掩码数据。
前面介绍过,布尔类型掩码数组可以直接作为Series或DataFrame的索引使用
2.2 剔除缺失值
除了前面介绍的掩码方法,还有两种很好用的缺失值处理方法,分别是dropna():剔除缺失值和fillna():填充缺失值。
而在DataFrame上使用他们时需要设置一些参数
我们没办法从DataFrame中单独剔除一个值,要么是剔除缺失值所在的整行,要么是整列。
根据实际需求,有时需要剔除整行,有时可能是整列,DataFrame中的dropna()会有一些参数可以配置。
默认情况下,dropn()会剔除任何包含缺失值的整行数据
但是这样做也会把非缺失值一并剔除,因为可能有时候只需要全部是缺失值的行或列,或者绝大多数是缺失值的行或列。
这些需求可以通过设置how或thresh参数来满足。他们可以设置剔除行或列缺失值的数量阈值。
默认设置是how='any',也就是说只要有缺失值就剔除整行或者整列(通过axis设置坐标轴)。你还可以设置how='all',这样就只会剔除全部是缺失值的行或列了。
还可以通过thresh参数设置行或列中非缺失值的最下数量,从而实现更加个性化的配置
2.3 填充缺失值
有时我们并不想移除缺失值,而是想把他们替换为有效的数值。有效的值有可能是0,1,2那样单独的值,也可能是经过填充或转换得到的,除了isnull()方法建立掩码来填充缺失值,Pandas为此专门提供了一个fillna()方法,它将返回缺失值后的数组副本。
DataFrame的操作方法与Series类似,只是在填充时需要设置坐标轴参数axis
需要注意的是,假如在从前往后填充时,需要填充的缺失值前面没有值,那么它就仍然是缺失值