一、普通青年的缺失值填补(自己举的例子)
raw=[1,2,3,np.nan,4,6,5,8]
sds=[3,2,7,5,4,8,3,5]
raw1=pd.DataFrame([raw,sds],columns=list('abcdefgh'))
raw1.set_index=list('AB')
raw1.iloc[1,4]=np.nan
raw1.iloc[1,3]=np.nan
raw1
a b c d e f g h
0 1 2 3 NaN 4.0 6 5 8
1 3 2 7 NaN NaN 8 3 5
raw1.fillna(0)
a b c d e f g h
0 1 2 3 0.0 4.0 6 5 8
1 3 2 7 0.0 0.0 8 3 5
raw1.fillna(raw1.iloc[0,:].mean())#填充某一行的均值
a b c d e f g h
0 1 2 3 4.142857 4.000000 6 5 8
1 3 2 7 4.142857 4.142857 8 3 5
raw1.dropna(thresh=7)#默认是保留的行的个数
a b c d e f g h
0 1 2 3 NaN 4.0 6 5 8
raw1.dropna(thresh=1,axis=1)#可以设置列保留的最低门槛
a b c e f g h
0 1 2 3 4.0 6 5 8
1 3 2 7 NaN 8 3 5
raw1.fillna({'d':4,'e':0})#添加列名和填补的值
a b c d e f g h
0 1 2 3 4.0 4.0 6 5 8
1 3 2 7 4.0 0.0 8 3 5
二、文艺青年的做法(以Titanic数据集为例,补充缺失值)
train=pd.read_csv('D:\\Users\\Administrator\\Documents\\Tencent Files\\FileRecv\\MobileFile\\train.csv',index_col=0)
train.head(6)
train.isnull().sum()
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
可以看出,Age里面缺失了177个,我们要设法补充这个数据。如果我们直接补充的是Age的均值也可以。
这里也可以更为精细化一些,即按照所处舱位的年龄的中位数进行补值。
#我们先看一下这几个舱位的均值或者中位数的情况。
train['Age'].groupby(train['Pclass']).median()#这里用的均值。
Pclass
1 37.0
2 29.0
3 24.0
Name: Age, dtype: float64
恩,感觉第一个等级的舱位和第三个等级的舱位,年龄中位数还是有较大差别的。那我们就对缺失年龄的数据按照
所在舱位的中位数填充好了。(也许有更好的填充方法,但目前只想到用下面的方法)
#按照pclass 的分组,以每个舱位中位数补充对应age的缺失值。
for i in range(len(train['Age'])):
if np.isnan(train.iloc[i,4]):
if train.iloc[i,1]==1:
train.iloc[i,4]=37
elif train.iloc[i,1]==1:
train.iloc[i,4]=29
else:
train.iloc[i,4]=24
#查看情况填补情况
train['Age'].isnull().sum()
0
按照设想,都填充上了。
ps:如有其它更好的方法,会继续改进.