Name特征中提取Title特征
-
字符串操作
str.extract()
利用正则表达式从字符串中提取匹配的子串replace()
对字符串中的特定模式进行替换
-
正则表达式
([A-Za-z]+)\.
匹配标题(如Mr., Mrs., Miss.等)中的字母部分和后面的.号
-
pandas数据框操作
df['新列名'] = df['原列名'].apply(函数)
应用函数到DataFrame的某一列pd.concat()
在轴向连接多个DataFrame
-
数据预处理
- 处理异常值/罕见类别值
- 特征编码(数值编码和One-Hot编码)
-
导入模块
import pandas as pd
from sklearn.preprocessing import LabelEncoder
-
实例化对象
le = LabelEncoder()
核心代码段:
# 提取Title
df['Title'] = df['Name'].str.extract('([A-Za-z]+)\.', expand=False)
# 处理罕见Title
df['Title'] = df['Title'].replace(['Lady','Countess','Capt','Col','Don','Dr','Major','Rev','Sir','Jonkheer','Dona'], 'Rare')
df['Title'] = df['Title'].replace(['Mlle','Ms'], 'Miss')
df['Title'] = df['Title'].replace('Mme', 'Mrs')
# 数值编码
le = LabelEncoder()
df['Title_Code'] = le.fit_transform(df['Title'])
# One-Hot编码
title_dummies = pd.get_dummies(df['Title'], prefix='Title')
df = pd.concat([df, title_dummies], axis=1)
使用pandas进行数据合并和重塑
- 导入pandas库
import pandas as pd
- 读取多个CSV文件
text_left_up = pd.read_csv("data/train-left-up.csv")
text_left_down = pd.read_csv("data/train-left-down.csv")
text_right_up = pd.read_csv("data/train-right-up.csv")
text_right_down = pd.read_csv("data/train-right-down.csv")
-
横向合并DataFrame
- 使用concat
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
result_up = text_left_up.join(text_right_up) result_down = text_left_down.join(text_right_down)
-
纵向合并DataFrame
- 使用concat
result = pd.concat([result_up, result_down])
- 使用append
result = result_up.append(result_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)
result = result_up.append(result_down)
- 保存DataFrame为CSV
result.to_csv('result.csv')
- 将DataFrame重塑为Series
unit_result = text.stack()
- Series另存为CSV
unit_result.to_csv('unit_result.csv')
可视化
- 导入相关库
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
这里导入了numpy、pandas数据分析库,matplotlib和seaborn可视化库。%matplotlib inline是jupyter环境下的魔法命令,用于在notebook中直接显示图像。
- 读取数据
text = pd.read_csv('result.csv')
从result.csv文件中读取数据,赋值给text DataFrame
- 男女生存人数可视化(柱状图)
sex = text.groupby('Sex')['Survived'].sum()
sex.plot.bar()
plt.title('survived_count')
plt.show()
这里先根据性别分组,计算出生存人数的sum值。然后调用Series的plot.bar方法直接生成柱状图,再加上标题。
柱状图适合对比不同类别的数据统计值,这里一眼可以看出男性和女性的生存人数差异情况。
- 男女生存/死亡人数比例可视化(堆积柱状图)
text.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked=True)
plt.title('survived_count')
plt.ylabel('count')
先按性别和生存情况分组,计算出各组的人数count值。unstack()方法可以将分组的行/列索引进行多级拆分。再用plot的kind='bar’生成柱状图,stacked=True使柱状图堆积在一起,从而可以看出各组占比情况。
这种堆积柱状图非常适合查看不同类别的构成比例。
- 不同票价生存情况可视化(折线图)
fare_sur = text.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending=False)
fare_sur.plot(grid=True)
fare_sur1 = text.groupby(['Fare'])['Survived'].value_counts()
fare_sur1.plot(grid=True)
先按票价分组,计算出各票价下生存/死亡人数的频数,分别对结果进行降序/不排序。然后直接调用plot方法绘制折线图。
折线图适合展示数据随变量的变化趋势,可以看出在生存/死亡人数随票价的变化情况,以及数据是否有序等。
- 不同仓位等级生存情况可视化(柱状图)
pclass_sur = text.groupby(['Pclass'])['Survived'].value_counts()
sns.countplot(x="Pclass", hue="Survived", data=text)
先按仓位分组,计算生存/死亡人数频数。然后用seaborn的countplot绘制分组计数的柱状图,x="Pclass"为坐标轴,hue="Survived"为分组条件。
这种分组柱状图清晰地展示了不同类别下两种分组的数据情况。
- 年龄生存情况可视化(核密度曲线)
facet = sns.FacetGrid(text, hue="Survived",aspect=3)
facet.map(sns.kdeplot,'Age',shade=True)
facet.set(xlim=(0, text['Age'].max()))
facet.add_legend()
首先利用FacetGrid创建一个多面板子图,按survived进行分面。map方法应用每个子图的数据。kdeplot绘制核密度估计曲线,可视化出每个年龄下生存/死亡的概率密度曲线。
这种可视化方式适合对比不同组别下单变量的分布情况,可以一眼看出生存组和死亡组在各个年龄段的差异。
- 不同仓位年龄分布可视化(折线图)
text.Age[text.Pclass == 1].plot(kind='kde')
text.Age[text.Pclass == 2].plot(kind='kde')
text.Age[text.Pclass == 3].plot(kind='kde')
plt.xlabel("age")
plt.legend((1,2,3),loc="best")
按仓位等级对年龄进行分组,利用plot的kind='kde’参数分别绘制出核密度估计曲线。
使用折线图可以在同一张图中对比不同类别下数据的分布情况,查看是否存在明显差异等。