缺失值的处理是一件艺术活,最高的境界应该是缺而不失。pandas中提供了非常丰富的工具来对缺失值进行处理。这里主要是对常用方法的简要介绍。
注:不同地区和软件对缺失值的表示方法不同,在用pandas读取文件时可指定缺失值的形式给参数na_values,如:
missing_values = ['n/a', 'na', '--']
df = pd.read_csv('文件名‘, na_values = missing_values)
缺失值处理常用策略:
- 对有缺失值的行和列简单的删除;
- 对缺失值进行计算,如用变量的平均值或众数进行填充;
- 在缺失值周围建立模型,然后用模型提供的值进行填充。
一、缺失值的删除
1.数据集中缺失值的统计
2.检查某列是否有缺失值
3.删除某列中有缺失值的行
4.删除有缺失值的行
如果需要某行全部是缺失值才删除时,可以添加参数
how = 'all', axis = 0
二、缺失值的计算
通常比较常用的填充缺失值的方法有计算变量的平均值、中位数和众数,更高级一点的是用K-NN和bayesian统计等算法来计算(R中比较出名的计算缺失值的包Amelia就是用bootstrap+EM算法求解)。不管哪种方法都应注意计算带来的bias。
中位数填充将
mean()
换成median()
,众数将其换成mode()[0]
, 如果是多列的话,可以用lambda函数,
fill_na = lambda col:col.fillna(col.mode()[0])
df.apply(fill_na, axis = 0)
三、 分类变量的热编码
对于分类变量的处理主要是采用热编码的方式,在其中可以指定缺失值是否去除
保留分类变量中的缺失值,将其单独作为一列, 加dummy_na = True
:
对数据集中每一个分类变量进行热编码,然后去除原来的变量:
def create_dummy_df(df, cols, dummy_na):
for col in cols:
df = pd.concat([df.drop(col, axis = 1), pd.get_dummies(df[col], dummy_na = dummy_na, axis = 1)
return df