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、马尔科夫链蒙德洛夫法