Datawhale---动手学数据分析---第一章:数据载入及初步观察(泰坦尼克的任务)
【回顾&引言】前面一章的内容大家可以感觉到我们主要是对基础知识做一个梳理,让大家了解数
据分析的一些操作,主要做了数据的各个角度的观察。那么在这里,我们主要是做数据分析的流程
性学习,主要是包括了数据清洗以及数据的特征处理,数据重构以及数据可视化。这些内容是为数
据分析最后的建模和模型评价做一个铺垫。
import numpy as np
import pandas as pd
df = pd.read_csv('train.csv')
df
我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经
过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗,本章我们将
学习缺失值、重复值、字符串和数据转换等操作,将数据清洗成可以分析或建模的亚子。
我们拿到的数据经常会有很多缺失值,比如我们可以看到Cabin列存在NaN,那其他列还有没有缺
失值,这些缺失值要怎么处理呢?
#方法一
df.info()
#方法二
df.isnull().sum()
#方法一
df[['Age','Cabin','Embarked']]
#方法二
df.iloc[:,[5,10,11]]
#方法三
df.loc[:,['Age','Cabin','Embarked']]
替换,删除,填充,不处理
#方法一
df[df['Age'] == None] = 0
df
这里可以发现编号889的Age列的数据并没有发生变化(数值列读取数据后,空缺值的数据类型为float64所以用None一般索引不到)
#方法二
df[df['Age'].isnull()] = 0
df
#方法三
df[df['Age'] == np.nan] = 0
df
而这里的Age列虽然发生了变化,但是其他列的数据也跟着发生了变化
所以应该怎样才能正确处理缺失值呢,经过查询资料后知道了dropna函数与fillna函数
详情见fillna()函数的用法&dropna()函数的用法
df.dropna()
df.fillna(0)
具体操作自己多加练习
由于这样那样的原因,数据中会不会存在重复值呢,如果存在要怎样处理呢
可以参考duplicate()函数的用法
df[df.duplicated()]
可知该数据没有整行的重复值,而当我们想知道某一列的数据是否有重复时,可在括号内加上列名
df[df.duplicated('Fare')]
处理重复值,首先要看它有没有用,如果没有用的话,一般是进行删除操作,否则保留
#删除票价一样的数据
df.drop_duplicates('Fare')
df.to_csv('train_clear.csv')
#重新导入numpy、pandas包和数据
import numpy as np
import pandas as pd
df = pd.read_csv('train.csv')
df
我们对特征进行一下观察,可以把特征大概分为两大类:
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散
型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked,
Ticket为类别型文本特征,数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性
及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。
详情见python pandas 分箱操作
完成下面的问题需要提前了解cut()的用法&qcut()的用法
df['Age_cut1'] = pd.cut(df['Age'], 5,labels = [1,2,3,4,5])
df
df['Age_cut2'] = pd.cut(df['Age'],[0, 5, 15, 30, 50, 80], labels = [1, 2, 3, 4, 5])
df
df['Age_cut3'] = pd.qcut(df['Age'],[0, 0.1, 0.3, 0.5, 0.7, 0.9], labels = [1, 2, 3, 4, 5])
df
#为了方便观察,直接三个存在一起了
df.to_csv('train_cut.csv')
方法一: value_counts(详情见value_counts()的用法)
df['Sex'].value_counts()
方法二: unique(详情见unique()的用法)
df['Sex'].unique()
方法一: replace(详情见replace()的用法)
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
df
方法二: map(详情见map()的用法)
方法三: 使用sklearn.preprocessing的LabelEncoder
详情见sklearn.preprocessing.LabelEncoder()的用法
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
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
for i in ['Sex', 'Embarked']:
x = pd.get_dummies(df[i], prefix = i)
df1 = pd.concat([df, x], axis=1)
df1.head()
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
df
df.to_csv('train2.csv')