Python 缺失值的填补(以TItanic数据集为例)

一、普通青年的缺失值填补(自己举的例子)

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:如有其它更好的方法,会继续改进.



猜你喜欢

转载自blog.csdn.net/lishangyin88/article/details/80167619