目前很多流行的数据集都会存在数据缺失的现象。
一般我们在用Pandas处理缺失值的方法有两种:
1.用覆盖全局的掩码来表示缺失值.(用布尔类型来代替原先数据/用0或1来表示)
2.用一个标签值来表示缺失值.(用一个具体的自定义的数据来表示,如-9999. 或用None或NaN)
具体使用哪种方法还需要看具体情况:
1.用掩码来处理会额外构造一个布尔数组,会增加存储
2.标签值方法缩小了可以被表示的有效值的范围,会增加额外的计算逻辑。而且NaN也不 能够表示所有数据类型。
Pandas的缺失值:1.Python对象类型的缺失值None(Python中不能将None与整数相加)
2.数值类型对象的缺失值NaN(NaN是一种特殊的浮点数,不是整数、字符串等其它数据类型;
且无论对和NaN做哪种操作,最终结果都是NaN)
Pandas中NaN与None的差异:实际上,Pandas把他们看成是可以等价交换的,合适的时候会将他们进行替换。
import pandas as pd import numpy as np pd.Series([1,np.nan,2,None]) Out[4]: 0 1.0 1 NaN 2 2.0 3 NaN dtype: float64
Pandas对不同缺失值的转换规则:
缺失值转换规则 NA标签值 floating浮点型 无变化 np.nan object对象类型 无变化 None或np.nan integer整数类型 强制转换为float64 np.nan boolean布尔类型 强制转换为object None或np.nan1. isnull()
创建一个布尔类型的掩码标签缺失值
2. notnull()
与isnull()操作相反
3. dropna(how= , axis=)
返回一个剔除缺失值的数据(无法单独剔除,只能剔除整列或整行)
df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
axis= 0 按行检查缺失;1 按列检查缺失。不写默认为0how= 'any' 有一个缺失值就算缺失;'all' 行或列(根据axis参数)全缺失才算缺失。不写默认为'any'thresh= x,x为一个整数,含义为行或列(根据axis参数)中非缺失数值个数大于等于x则不算缺失,即小于x则算缺失,会被去除。subset= 标签名。选择要对哪个列或行(与axis中的相反)进行检查缺失,没写的则不检查。即限制检查范围。4. fillna( method= , axis= )
返回一个填充了缺失值的数据副本(一般直接fillna(-9999)就好
method有‘ffill’:从前往后填充
‘bfill’:从后往前填充)
