一.我们先大概随机生成一个可以处理的数据
import numpy as np
import pandas as pd
X = np.random.normal(0,5,(100,7))
column = ['a','b','c','d','e','f','g']
X = pd.DataFrame(X,columns=column)
X['g'][X['g']>0]=1
X['g'][X['g']<=0]=0
二.随机构造缺失值
#构造一些缺失值
none = np.random.randint(0,99,10)
X['a'][none] = None
none = np.random.randint(0,99,5)
X['g'][none] = None
X.info()
1.删除观测
在一条观测上的多个特征都缺失的时候,进行再多的缺失值填补过于主观,此时可以将其删除
2. 平均值填充
最常见的,但这是再不能获取数据规律及联系时才用,个人觉得因数据而已,比如一个时间序列,其具有时间的趋势,故不能简单的利用均值填充
#平均数填充
X['a'] = X['a'].fillna(X['a'].mean())
3. 组内均值填充
在有多个特征的时候,可利用缺失值的特征X[‘a’]与其他各个特征或者目标分类回归进行相关性检验,若
import seaborn as sns
import matplotlib.pyplot as plt
def test(df):
dfData = df.corr()
plt.subplots(figsize=(9, 9)) # 设置画面大小
sns.heatmap(dfData, annot=True, vmax=1, square=True, cmap="Reds")
plt.savefig('./BluesStateRelation.png')
plt.show()
test(X)
看到特征a和特征b的相关性最高(emmmm,虽然这里不高,但就举个例子好说话);根据特征c的组内均值进行填充或者最值等。
mean_b=X[['a','b']].groupby('b').mean()['a']
X.loc[X[X['a'].isnull()].index,'a'] = X.loc[X[X['a'].isnull()].index,'b'].map(mean_b)
4.众数填充
同特征中采用最常见的特征值填充
X['g'].value_counts() # 显示出各个特征值的频数
X['g'] = X['g'].fillna(0)
X['g'].value_counts()
5.时间序列填充
若此数据中带有时间特征,或者周期特征,可考虑时间的连续性,对于某一个缺失值,可以采用临近的几个值进行拟合(线性,插条,等,虽然可能造成的成本较高,但这在数据量较小的时候不失为一种方法)。