第二章(PART1):数据清洗及特征处理
2.1 缺失值观察与处理?
我们拿到的数据经常会有很多缺失值,比如我们可以看到Cabin列存在NaN,那其他列还有没有缺失值,这些缺失值要怎么处理呢
2.1.1 任务一:缺失值观察
(1) 请查看每个特征缺失值个数
df.info()
df.isnull().sum()
(2) 请查看Age, Cabin, Embarked列的数据
df[['Age','Cabin','Embarked']].head()
注意:[[]]返回的是df
[]返回的是series
2.1.2 任务二:对缺失值进行处理?
(1)处理缺失值一般有几种思路
1.dropna:丢弃带有NAN的项
df.dropna().head()
2.fillna:用常数值代替NAN的项
df.fillna(值).head()
【思考1】dropna和fillna有哪些参数,分别如何使用呢?
dropna:
axis: default 0指行,1为列
how: {‘any’, ‘all’}, default ‘any’指带缺失值的所有行;'all’指清除全是缺失值的
thresh: int,保留含有int个非空值的行
subset: 对特定的列进行缺失值删除处理
inplace: True表示直接在原数据上更改
fillna:
【思考2】检索空缺值用np.nan要比用None好,这是为什么?
None是一个python特殊的数据类型, 但是NaN却是用一个特殊的float
(2) 请尝试对Age列的数据的缺失值进行处理
df[df['Age']==np.nan]=0
df.head()
df.fillna({'Age':0,'Cabin':1}).head()
(3) 请尝试使用不同的方法直接对整张表的缺失值进行处理
df.fillna(value=0)
df.fillna(method='pad',axis=0)
用前一行补充空位
df.fillna(method='backfill', axis=1))
用后一列补充空位
2.2 重复值观察与处理
由于这样那样的原因,数据中会不会存在重复值呢,如果存在要怎样处理呢
2.2.1 任务一:请查看数据中的重复值
df[df.duplicated()]
2.2.2 任务二:对重复值进行处理
df.drop.duplicates().head()
q=去除重读的行,两行相同,保留一个。
2.2.3 任务三:将前面清洗的数据保存为csv格式
df.to_csv('text_csv’)
2.3.1 任务一:对年龄进行分箱(离散化)处理?
(1) 分箱操作是什么?
就是将不同的东西,按照特定的条件放到一个指定容器里,比如水果 把绿色的放一个篮子里,红色一个篮子等等,这个篮子就是箱,而水果就是数据 颜色就是条件
数据主要分为连续变量和分类变量,分箱的操作主要针对于连续变量。
为什么要对数据进行分箱操作
稳定性,时间复杂度,看的舒服,提高准确度 等等
分箱分为 有监督和无监督
(2) 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
df['AgeBand']=pd.cut[df['Age'],5,labels=['1','2','3','4','5']
df.head
(3) 将连续变量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()
(4) 将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
df['AgeBand']=df.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],
labels=['1','2','3','4','5'])
df.head()
(5) 将上面的获得的数据分别进行保存,保存为csv格式
df.to_csv(‘test_new.csv’)
2.3.2 任务二:对文本变量进行转换
(1) 查看文本变量名及种类
df['Sex'].value_counts()
df['Cabin'].value_counts()
df['Embarked'].valur_counts()
value_counts:对·series中的计数及排序,查看某列有多少不同值
df['Sex'].unique()
df().unique:对于一维数组或列表,unique函数去除重复的元素,并按照元素的大小返回新的新的无重复元素的元素或列表。
df['Sex'].nunique()
(2) 将文本变量Sex, Cabin ,Embarked用数值变量12345表示
df['Sex_num']=df['Sex'].replace(['male','female'],[1,2])
df.head()
df['Sex_num']=df['Sex'].map({'male':1,'female':2})
df.head()
4.5.3
任务三(附加):从纯文本Name特征里提取出Titles的特征 (所谓的Titles就是Mr,Miss,Mrs等) #将类别文本转换为one-hot编码
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
df.head()
[A-Za-z]指a-z字母里面的一个单词,大写或小写都行,不区分,最少一个字母。