二、数据预处理及可视化(第二天)
–real python
- 小建议在最后
文章目录
来源
- 文章内容来源于Datewhale的hands-on-data-analysis项目
- 地址:https://github.com/datawhalechina/hands-on-data-analysis
- 作者:金娟娟,陈安东,杨佳达,老表,李玲,张文涛,高立业
- 笔记目的: 借助五一复习一下pandas
1 数据预处理及特征工程
1.1 缺失数据统计与处理
1.1 任务一:缺失值统计
(1) 请查看每个特征缺失值个数
- 可用
isna
或isnull
(两个函数没有区别)来查看每个单元格是否缺失,mean
查看比例,sum
查看数量
df.isnull().sum()
df.isnull().mean()
(2) 请查看Age, Cabin, Embarked列的数据
#写入代码
df[['Age','Cabin','Embarked']].head(3)
1.2 任务二:对缺失值进行处理
-
处理方式: 删除
dropna
和填充fillall
-
deopha
主要参数为轴方向axis
(默认为0,即删除行)、删除方式how
、删除的非缺失值个数阈值thresh
( 非缺失值 没有达到这个数量的相应维度会被删除)、备选的删除子集subset
,其中how
主要有any
和all
两种参数可以选择。 -
fillna
中有三个参数是常用的:value, method, limit
。其中,value
为填充值,可以是标量,也可以是索引到元素的字典映射;method
为填充方法,有用前面的元素填充ffill
和用后面的元素填充 bfill 两种类型,limit
参数表示连续缺失值的最大填充次数。
df1 = df.dropna().head()
df1.reset_index(inplace=True)
df1
#0填充
df.fillna(0).head()
1.2 重复值统计及处理
1.2.1 重复值统计
-
duplicated()
显示各行是否有重复行,没有重复行显示为FALSE,有重复行显示为TRUE;
df[df.duplicated()]
1.2.2 重复值处理
-
drop_duplicates
方法用于返回一个移除了重复行的DataFrame
df.drop_duplicates().head()
—
1.3 特征工程
1.3.1 数据分桶
- 数据分桶是一种数据预处理技术,用于减少次要观察误差的影响
为什么要进行数据分桶?
- 离散后稀疏向量内积乘法运算速度更快,计算结果也方便存储,容易扩展;
- 离散后的特征对异常值更具鲁棒性,如 age>30 为 1 否则为 0,对于年龄为 200 的也不会对模型造成很大的干扰;
- LR 属于广义线性模型,表达能力有限,经过离散化后,每个变量有单独的权重,这相当于引入了非线性,能够提升模型的表达能力,加大拟合;
- 离散后特征可以进行特征交叉,提升表达能力,由 M+N 个变量编程 M*N 个变量,进一步引入非线形,提升了表达能力;
- 特征离散后模型更稳定,如用户年龄区间,不会因为用户年龄长了一岁就变化;
- 可以将缺失作为独立的一类带入模型;
- 将所有的变量变换到相似的尺度上。
- 分桶方法分为无监督分桶和有监督分桶。
(1)常用的无监督分桶方法有等频分桶、等距分桶和聚类分桶。
(2) 有监督分桶主要有best-ks分桶和卡方分桶。 pd.cut( x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise', )
#将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'], 5,labels = ['1','2','3','4','5'])
df.head()
#将连续变量Age划分为(0,5] (5,15] (15,30] (30,50] (50,80]五个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = ['1','2','3','4','5'])
df.head(3)
#将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
df = pd.read_csv('train.csv')
df['AgeBand'] = pd.qcut(df['Age'],
[0,0.1,0.3,0.5,0.7,0.9],
labels = ['1','2','3','4','5'])
df.head()
1.3.2 标签编码和独热编码
- 标签编码将文本变量Sex, Cabin ,Embarked用数值变量12345表示
df = pd.read_csv('test_clear.csv')
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket','Sex']:
lbl = LabelEncoder()
label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
df[feat + "_labelEncode"] = df[feat].map(label_dict)
df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))
df.head()
- 其他方法:
#方法一: replace
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
df.head()
#方法二: map
df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2})
df.head()
- 独热编码将文本变量Sex, Cabin, Embarked用one-hot编码表示
for feat in ["Age", "Embarked"]:
# x = pd.get_dummies(df["Age"] // 6)
# x = pd.get_dummies(pd.cut(df['Age'],5))
x = pd.get_dummies(df[feat], prefix=feat)
df = pd.concat([df, x], axis=1)
#df[feat] = pd.get_dummies(df[feat], prefix=feat)
df.head()
2 数据重构
2.1 数据合并
-
已知有
text-left-up.csv, text-right-up.csv, text-left-down, text-right-down
四张表 -
concat
中,最常用的有三个参数,它们是axis
,join
,keys
,分别表示拼接方向,连接形式,以及在新表中指示来自于哪一张旧表的名字. -
join
函数除了必须的on
和how
之外,可以对重复的列指定左右后缀lsuffix
和rsuffix
。其中,on
参数指索引名,单层索引时省略参数表示按照当前索引连接。 -
merge
主要就是on
和how
;left_on
左侧DataFarme中用作连接键的列right_on
右侧DataFarme中用作连接键的列
2.1.1 横向合并
-
concat
利用axis=1
result_up = pd.concat([text_left_up,text_right_up],axis=1)
result_down = pd.concat([text_left_down,text_right_down],axis=1)
join
resul_up = text_left_up.join(text_right_up)
result_down = text_left_down.join(text_right_down)
merge
result_up = pd.merge(text_left_up,text_right_up,
left_index=True,right_index=True)
result_down = pd.merge(text_left_down,text_right_down,
left_index=True,right_index=True)
2.1.2 纵向合并
concat
result = pd.concat([result_up,result_down])
append
result = result_up.append(result_down)
2.2 数据分组
-
df.groupby(分组依据)[数据来源].使用操作
-
1.计算泰坦尼克号男性与女性的平均票价
text = pd.read_csv('result.csv')
text.head()
text.groupby('Sex')['Fare'].mean()
-
- 统计泰坦尼克号中男女的存活人数
text.groupby('Sex')['Survived'].sum()
3.计算客舱不同等级的存活人数
text.groupby('Pclass')['Survived'].sum()
- agg()函数复现2和3
text.groupby(['Sex','Pclass'])['Survived'].agg({'Sex': [('sum_sex','sum')], 'Pclass': [('sum_pclass','sum')]})
小建议
- 第一节 2.3.1 任务一
- 第二节 2.5.1
3. 第二节2.5.1
- 第三节 2.4.4