Pandas数据分析-Task8
记录DataWhale的Pandas数据分析的学习过程,使用的教材为 joyful-pandas。
Task6是pandas的缺失值处理,内容基本可以分为三个部分,第一部分介绍缺失值的个数统计与删除;第二部分介绍缺失数据的填充与插值’第三部分介绍Nullable数据类型。本篇文章中所有的代码示例中用到的原始文件都可以在 此链接中下载。
思维导图
练一练
思路:利用fillna函数,设置limit=1会导致连续缺失值的第一个会被补充,不满足要求,考虑结合method参数,进行两次填充,第一次method=‘ffill’,第二次method=‘bfill’,因为NaN值加任何值结果都为NaN,所以最后将这两次结果相加即可达到要求。
s = pd.Series([ 1,np.nan ,3,np.nan, np.nan])
r1=s.fillna(limit=1,method='ffill')
r2=s.fillna(limit=1,method='bfill')
(r1+r2)/2
>>>
>0 1.0
1 2.0
2 3.0
3 NaN
4 NaN
练习-用回归模型解决分类问题
1 .思路:KNeighborsRegressor的输出只能是数值型的,所以无法进行直接分类,一个最直接的想法是类别特征数值化,然后作为label进行拟合。最简单的类别特征数值化的方法就是哑铃编码,pd.get_dummies()函数可以完成这个操作;这里还有一个问题是,KNeighborsRegressor的输出是数值,需要将其映射为类别变量,还需要记住pd.get_dummies()函数编码后的哑铃变量哪个维度代表的哪个类别。
from sklearn.neighbors import KNeighborsRegressor
df = pd.read_excel('data/color.xlsx')
dum=pd.get_dummies(df.Color)
#dum作为数值型的label可以直接进行拟合;同时dum.columns可以看作哑铃编码到实际类别的一个字典映射,方便后续从哑铃编码恢复类别编码。
clf = KNeighborsRegressor(n_neighbors=6)
clf.fit(df.iloc[:,:2], dum)
r=clf.predict([[0.8, -0.2]])
dum.columns[np.array(r[0]).argmax()]#利用dum.columns恢复真实的类别特征。
>Yellow
2 . 第二问和第一问方法基本相同,区别在于第二问需要自己构造出训练集和测试集,而且有多个类别型特征需要转换。
from sklearn.neighbors import KNeighborsRegressor
df = pd.read_csv('data/audit.csv')
r=df.isna().sum() #查看缺失情况。
>>>
>ID 0
Age 0
Employment 100
Marital 0
Income 0
Gender 0
Hours 0
#看出只有Employment列有缺失,将其作为拟合目标,其余列作为特征。
#划分训练集和测试集
full=df[df.Employment.notna()]
na=df[df.Employment.isna()]
label=pd.get_dummies(full['Employment'])#训练集标签
full_feature=pd.concat([full[['Age','Income','Hours']],pd.get_dummies(full[['Marital','Gender']])],axis=1)#训练集特征
na_feature=pd.concat([na[['Age','Income','Hours']],pd.get_dummies(na[['Marital','Gender']])],axis=1)#测试集特征
clf = KNeighborsRegressor(n_neighbors=6)
clf.fit(full_feature, label)
r=clf.predict(na_feature)#拟合结果,每一个样本的结果为一数值向量。
res=[label.columns[i] for i in r.argmax(axis=1)#利用label.columns将数值结果变为真实的类别结果。
df.loc[df.Employment.isna(),'Employment']=res ]