第二章:数据清洗及特征处理

开始之前,导入numpy、pandas包和数据

#加载所需的库
import numpy as np
import pandas as pd
#加载数据train.csv
data = pd.read_csv('train.csv')
data.head(3)

我们一般拿到的数据比较杂,有很多的噪音,需要进一步的处理。譬如数据中有异常值,缺失值,经过一定的处理后才能够做后面的分析和处理。所以需要进行数据的清洗
2.1 缺失值的观察与处理
我们拿到的数据通常会有缺失值,例如Cabin列存在NaN,如何处理缺失值。
2.1.1 任务一:缺失值观察
查看每个特征缺失值个数

#方法一
data.info()
#方法二
data.isnull().sum()

查看Age, Cabin, Embarked列

data[['Age','Cabin','Embarked']].head(3)

2.1.2 任务二:对缺失值进行处理
对Age列的数据的缺失值进行处理

data[data['Age']==None]=0
data.head(3)
data[data['Age'].isnull()] = 0
data.head(3)
data[data['Age'] == np.nan] = 0
data.head()

None一般索引不到空缺值的数据类型为float64,np.nan更好

data.dropna().head(3)
data.fillna(0).head(3)

2.2 重复值观察与处理
2.2.1 任务一:请查看数据中的重复值

data[data.duplicated()]

2.2.2 任务二:对重复值进行处理
处理整个行有重复值

data = data.drop_duplicates()
data.head()

2.2.3 任务三:将前面清洗的数据保存为csv格式

data.to_csv('test_clear.csv')

2.3 特征观察与处理
2.3.1 任务一:对年龄进行分箱(离散化)处理
要求:
(1) 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
(2) 将连续变量Age划分为(0,5] (5,15] (15,30] (30,50] (50,80]五个年龄段,并分别用类别变量12345表示
(3) 将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示
(4) 将上面的获得的数据分别进行保存,保存为csv格式

#将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
data['AgeBand'] = pd.cut(data['Age'], 5,labels = [1,2,3,4,5])
data.head()
data.to_csv('test_ave.csv')
#将连续变量Age划分为(0,5] (5,15] (15,30] (30,50] (50,80]五个年龄段,并分别用类别变量12345表示
data['AgeBand'] = pd.cut(data['Age'],[0,5,15,30,50,80],labels = [1,2,3,4,5])
data.head(3)
data.to_csv('test_ave.csv')
#将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
data['AgeBand'] = pd.qcut(data['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
data.head()
data.to_csv('test_ave.csv')

2.3.2 任务二:对文本变量进行转换
主要内容:
(1) 查看文本变量名及种类
(2) 将文本变量Sex, Cabin ,Embarked用数值变量12345表示
(3) 将文本变量Sex, Cabin, Embarked用one-hot编码表示

#查看类别文本变量名及种类
#方法一: value_counts
data['Sex'].value_counts()
data['Cabin'].value_counts()
data['Embarked'].value_counts()
#方法二: unique
data['Sex'].unique()
data['Cabin'].unique()
data['Embarked'].unique()
#将类别文本转换为12345
#方法一: replace
data['Sex_num'] = data['Sex'].replace(['male','female'],[1,2])
data.head()
#方法二: map
data['Sex_num'] = data['Sex'].map({'male': 1, 'female': 2})
data.head()
#方法三: 使用sklearn.preprocessing的LabelEncoder
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
    lbl = LabelEncoder()  
    label_dict = dict(zip(data[feat].unique(), range(data[feat].nunique())))
    data[feat + "_labelEncode"] = data[feat].map(label_dict)
    data[feat + "_labelEncode"] = lbl.fit_transform(data[feat].astype(str))
data.head()
#将类别文本转换为one-hot编码
#方法一: OneHotEncoder
for feat in ["Age", "Embarked"]:
    x = pd.get_dummies(data[feat], prefix=feat)
    data = pd.concat([data, x], axis=1)    
data.head()

2.3.3 任务三(附加):从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)

data['Title'] = data.Name.str.extract('([A-Za-z]+)\.', expand=False)
data.head()
data.to_csv('test_fin.csv')

第二节 数据重构1
2.4 数据的合并
2.4.1 任务一:将data文件夹里面的所有数据都载入,与之前的原始数据相比,观察他们的之间的关系

text_left_up = pd.read_csv("train-left-up.csv")
text_left_up.head()
text_left_down = pd.read_csv("train-left-down.csv")
text_left_down.head()
text_right_up = pd.read_csv("train-right-up.csv")
text_right_up.head()
text_right_down = pd.read_csv("train-right-down.csv")
text_right_down.head()

2.4.2:任务二:使用concat方法:将数据train-left-up.csv和train-right-up.csv横向合并为一张表,并保存这张表为result_up

list_up = [text_left_up,text_right_up]
result_up = pd.concat(list_up,axis=1)
result_up.head()

2.4.3 任务三:使用concat方法:将train-left-down和train-right-down横向合并为一张表,并保存这张表为result_down。然后将上边的result_up和result_down纵向合并为result。

list_down=[text_left_down,text_right_down]
result_down = pd.concat(list_down,axis=1)
result = pd.concat([result_up,result_down])
result.head()

2.4.4 任务四:使用DataFrame自带的方法join方法和append:完成任务二和任务三的任务

resul_up = text_left_up.join(text_right_up)
result_down = text_left_down.join(text_right_down)
result = result_up.append(result_down)
result.head()

2.4.5 任务五:使用Panads的merge方法和DataFrame的append方法:完成任务二和任务三的任务

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 = resul_up.append(result_down)
result.head()

2.4.6 任务六:完成的数据保存为result.csv

result.to_csv('result.csv')

2.5 换一种角度看数据
2.5.1 任务一:将我们的数据变为Series类型的数据

# 将完整的数据加载出来
text = pd.read_csv('result.csv')
text.head()
unit_result=text.stack().head(20)
unit_result.head()
#将代码保存为unit_result,csv
unit_result.to_csv('unit_result.csv')
test = pd.read_csv('unit_result.csv')

第二节 数据重构2 数据聚合与运算

# 导入基本库
import numpy as np
import pandas as pd
# 载入data文件中的:result.csv
text = pd.read_csv('result.csv')
text.head()

2.6 数据运用
2.6.1 任务一:通过《Python for Data Analysis》P303、Google or Baidu来学习了解GroupBy机制

#百度了一下,有点牛皮,真正的excel

2.4.2:任务二:计算泰坦尼克号男性与女性的平均票价

df  = text['Fare'].groupby(text['Sex'])
means = df.mean()
means

2.4.3:任务三:统计泰坦尼克号中男女的存活人数

survived_sex = text['Survived'].groupby(text['Sex']).sum()
survived_sex.head()

2.4.4:任务四:计算客舱不同等级的存活人数

survived_pclass = text['Survived'].groupby(text['Pclass'])
survived_pclass.sum()

2.4.5:任务五:统计在不同等级的票中的不同年龄的船票花费的平均值

text.groupby(['Pclass','Age'])['Fare'].mean().head()

2.4.6:任务六:将任务二和任务三的数据合并,并保存到sex_fare_survived.csv

result = pd.merge(means,survived_sex,on='Sex')
result.to_csv('sex_fare_survived.csv')

2.4.7:任务七:得出不同年龄的总的存活人数,然后找出存活人数最多的年龄段,最后计算存活人数最高的存活率(存活人数/总人数)

#不同年龄的存活人数
survived_age = text['Survived'].groupby(text['Age']).sum()
survived_age.head()
#找出最大值的年龄段
survived_age[survived_age.values==survived_age.max()]
_sum = text['Survived'].sum()
print(_sum)
#求最大存活率,首先计算总人数
_sum = text['Survived'].sum()
print("sum of person:"+str(_sum))
precetn =survived_age.max()/_sum
print("最大存活率:"+str(precetn))

第三节,数据可视化

# 加载所需的库 nupy pandas matplotlib
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#导入result.csv这个文件
text = pd.read_csv(r'result.csv')
text.head()

2.7 如何让人一眼看懂你的数据?
2.7.2 任务二:可视化展示泰坦尼克号数据集中男女中生存人数分布情况(用柱状图试试)

sex = text.groupby('Sex')['Survived'].sum()
sex.plot.bar()
plt.title('survived_count')
plt.show()

2.7.3 任务三:可视化展示泰坦尼克号数据集中男女中生存人与死亡人数的比例图(用柱状图试试)。

# 提示:计算男女中死亡人数 1表示生存,0表示死亡
text.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked='True')
plt.title('survived_count')
plt.ylabel('count')

2.7.4 任务四:可视化展示泰坦尼克号数据集中不同票价的人生存和死亡人数分布情况。(用折线图试试)(横轴是不同票价,纵轴是存活人数)

# 计算不同票价中生存与死亡人数 1表示生存,0表示死亡
fare_sur = text.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending=False)
fare_sur
# 排序后绘折线图
fig = plt.figure(figsize=(20, 18))
fare_sur.plot(grid=True)
plt.legend()
plt.show()
# 排序前绘折线图
fare_sur1 = text.groupby(['Fare'])['Survived'].value_counts()
fare_sur1
fig = plt.figure(figsize=(20, 18))
fare_sur1.plot(grid=True)
plt.legend()
plt.show()

2.7.5 任务五:可视化展示泰坦尼克号数据集中不同仓位等级的人生存和死亡人员的分布情况。(用柱状图试试)

# 1表示生存,0表示死亡
pclass_sur = text.groupby(['Pclass'])['Survived'].value_counts()
pclass_sur
import seaborn as sns
sns.countplot(x="Pclass", hue="Survived", data=text)

2.7.6 任务六:可视化展示泰坦尼克号数据集中不同年龄的人生存与死亡人数分布情况。

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()

2.7.7 任务七:可视化展示泰坦尼克号数据集中不同仓位等级的人年龄分布情况

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")

感谢datawhale的组织

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值