常见的数据缺失填充方式分为很多种,比如删除法、均值法、回归法、KNN、MICE、EM等等。R语言包中在此方面比较全面,python稍差。
python目前已有的两种常见的包,第一个是impyute,第二个是fancyimpute。比如fancyimpute中集成了很多方式,包括均值、众数、频数填充,KNN填充、MCMC填充等。
一、直接填充
0值/-1值填充
data = pd.read_csv(path,encoding='gbk')
data = data.fillna(-1)1
2
单变量填补
用单一变量的均值/中位数/二分之一最小值/零值进行补值,这种方法会导致数据分布的偏移,方差偏小,PCA上会看到一条补值导致的直线等问题。
二、插值填充
data = pd.read_csv(path,encoding='gbk')
for f in data: # 插值法填充
data[f] = data[f].interpolate()
data.dropna(inplace=True)1
2
3
4
interpolate函数默认采用线性插值,即假设函数是直线形式,缺失值用前一个值和后一个值的平均数填充。
还可以根据数字来进行插值,用到参数method=‘values’,此时索引的数值实际上就是用于估计y的x值。
如果index是时间,我们还可以用method=time来插值。不过当dataframe是多重索引(multiIndex)时,只能用线性插值。
此外还可以通过参数设定采用多项式插值填充等方式。
参考:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.interpolate.html
https://jingyan.baidu.com/article/a501d80cf7c9c3ec620f5e5a.html
三、KNN预测缺失值进行填充
这里使用的是fancyimpute库,安装的时候需要visual C++环境。
from fancyimpute import KNN
data = pd.read_csv(path,encoding='gbk')
data = pd.DataFrame(KNN(k=6).fit_transform(data))
data.columns = ['sex','age','label'] # fancyimpute填补缺失值时会自动删除列名1
2
3
4
5
注意fancyimpute的KNN填补会自动去除DataFrame数据的列名,所以如果后续操作对列名有要求,需要重新添加列名。
四、可视化
见本人的另一篇博文。