python对空缺值填补方法(汇总)


在我们进行数据分析时,通常会遇到各种数据缺失的情况,针对这种情况我们该如何进行填补呢?

1、人工填补 该方法仅适用于小数据集,受个人因素影响。

2、平均值填补 对某一列的缺失值,采用该列的平均值填充

df.fillna(method=a.mean(),inplace=True)
#此处重点讲解一下fillna的参数,后面不做说明
?
fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
#value:固定值,可以用固定数字、均值、中位数、众数等,此外还可以用字典,series等形式数据;
#method:填充方法,'bfill','backfill','pad','ffill'
#axis: 填充方向,默认0和index,还可以填1和columns
#inplace:在原有数据上直接修改
#limit:填充个数,如1,每列只填充1个缺失值

3、临近值填补 对每一列的缺失值,采用临近位置的数据进行填充。

#使用每列缺失值前面的值进行填充(按相应列填充,按照相应index前后填充)
df.fillna(method='ffill',inplace=True)
df.fillna(method='pad',inplace=True)
#使用每列缺失值后面的值进行填充(按相应列填充,按照相应index前后填充)
df.fillna(method='backfill',inplace=True)
df.fillna(method='bfill',inplace=True)
#使用每列缺失值前面的值进行填充(按相邻列填充,按照相应columns前后填充)
df.fillna(method='ffill',inplace=True,axis=1)
df.fillna(method='pad',inplace=True,axis='columns')
#使用每列缺失值后面的值进行填充(按相邻列填充,按照相应columns前后填充)
df.fillna(method='backfill',inplace=True,axis=1)
df.fillna(method='bfill',inplace=True,axis='columns')

对每一列的缺失值,采用临近位置上下两个值的平均值来填充

#上下两个值的平均值进行填充
df=df.fillna(df.interpolate())
#在此详细介绍下interpolate函数的参数:'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'spline', 'barycentric', 'polynomial'

4、中位数填补 对每列的数值采用中位数进行填补

df.fillna(df.median(),inplace=True)

5、众数填补 对每列数值采用众数填补

df.fillna(df.mode(),inplace=True)

6、回归填补 对于有缺失值的特征值,将已知特征值代入模型来估计未知特征值,以此估计值来进行填充,该填充方法适用于缺失值为定量的数据类型。

from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
#data为缺失的数据集
imp = IterativeImputer(max_iter=10, random_state=0)
imp.fit(data)  
?
print(np.round(imp.transform(data)))

7、热平台填补

  • 热平台插补又被称为热卡插补,是从每一缺失数据的估计分布抽取插补值来取代缺失值,使用回答单元中的抽样分布作为抽样分布是常见的方法。热卡插补包括随机抽样插补、分层热卡插补、最近距离热卡插补和序贯热卡插补。

  • 随机抽样插补。缺失值为Missing Completely at Random,MCAR,即完全随机缺失的情况下,对某个确实字段进行简单随机抽样、限制对回答单元的使用次数、对回答单元进行排序并进行抽样;

  • 分层热卡填补。首先按照某些辅助变量对y进行分层,然后对分层的数据进行热卡插补;

  • 最近距离热卡插补。利用辅助变量,定义一个测量单元间距离的函数,在变量y的无回答单元临近的回答单元中,选择满则设定的距离条件的辅助变量中的单元所对应的变量y的回答单元作为插补值。由于使用较为复杂的距离函数,很难对插补后的均值和方差等估计量的性质进行考察;

  • 序贯热卡填充。基于最近距离热卡插补来实现的,首先对数据分层,在每层中按照选定的某个辅助变量排序,并在其前后相邻的10个数据中,找到是的设定的某一个距离函数的值达到最小的单元,使用该单元对应的变量y的回答单元作为插补值。

8、冷平台填补 从以前的调查中或其他信息来源中获得,如历史数据。

9、极大似然估计 缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化。该方法适用于大样本。

10、k均值聚类法 该方法又被称为K最近距离邻法。实现方式为:采用k-means聚类将所有样本进行聚类划分,然后再通过划分的种类的均值对各自类中的缺失值进行填补。

11、随机森林填补 采用随机森林来对缺失值进行拟合。

from  sklearn import ensemble
from sklearn.preprocessing import LabelEncoder
def set_missing(df,estimate_list,miss_col):
   """df要处理的数据帧,estimate_list用来估计缺失值的字段列表,miss_col缺失字段名称;会直接在原来的数据帧上修改"""
   col_list=estimate_list
   col_list.append(miss_col)  
   process_df = df.loc[:,col_list]
   class_le= LabelEncoder()
   for i in col_list[:-1]:
       process_df.loc[:,i]=class_le.fit_transform(process_df.loc[:,i].values)
   #分成已知该特征和未知该特征两部分
   known=process_df[process_df[miss_col].notnull()].values
   known[:, -1]=class_le.fit_transform(known[:, -1])
   unknown = process_df[process_df[miss_col].isnull()].values
   #X为特征属性值
   X = known[:, :-1]
   #y为结果标签值
   y = known[:, -1]
   #fit到RandomForestRegressor之中
   rfr = ensemble.RandomForestRegressor(random_state=1, n_estimators=200,max_depth=4,n_jobs=-1)
   rfr.fit(X,y)
   #用得到的模型进行未知特征值预测
   predicted = rfr.predict(unknown[:, :-1]).round(0).astype(int)
   predicted=class_le.inverse_transform(predicted)
   print(predicted)
?
   # 用得到的预测结果填补原缺失数据
   df.loc[(df[miss_col].isnull()), miss_col] = predicted
   return df
?
?

#还可以用决策树做拟合

from sklearn import tree
dt=tree.DecisionTreeRegressor()
dt.fit(X,y)
predicted = clf.predict(unknown[:, :3]).round(0)
predicted=class_le.inverse_transform(predicted)
print(predicted)

12、趋势得分法

13、马尔科夫链蒙德洛夫法

14、随机回归填补

15、增加虚拟变量

在原有数据集上增加一个字段。判断特征值是否有缺失值来定义一个新的二分类变量

 

———————————————— 版权声明:本文为CSDN博主「theskylife」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_41780234/article/details/103306928