Datawhale7月组队学习task2数据清洗
Posted 临风而眠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Datawhale7月组队学习task2数据清洗相关的知识,希望对你有一定的参考价值。
Datawhale7月task2数据清洗
在许多数据分析工作中,缺失数据是经常发生的。pandas的目标之一就是尽量轻松地处理缺失数 据。例如,pandas对象的所有描述性统计默认都不包括缺失数据
我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗,将数据清洗成可以分析或建模的样子。
文章目录
一.缺失值观察与处理
我们拿到的数据经常会有很多缺失值,比如我们可以看到Cabin列存在NaN,那其他列还有没有缺失值,这些缺失值要怎么处理呢
1.任务一:缺失值观察
(1) 查看每个特征缺失值个数
方法一:.info()
import numpy as np
import pandas as pd
df = pd.read_csv("train.csv")
df.info()
用某项数据的总行数减去
Non-Null Count
即得到某项数据的缺失值个数
运行结果
:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Sex 891 non-null object
5 Age 714 non-null float64
6 SibSp 891 non-null int64
7 Parch 891 non-null int64
8 Ticket 891 non-null object
9 Fare 891 non-null float64
10 Cabin 204 non-null object
11 Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
方法二:.isnull.sum()
df.isnull().sum()
运行结果
:
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
(2) 查看Age, Cabin, Embarked列的数据(多种方式)
三种常用方法
df[['Age','Cabin','Embarked']]
df.loc[:,['Age','Cabin','Embarked']]
df.iloc[:,[5,10,11]]
运行结果
:
Age | Cabin | Embarked | |
---|---|---|---|
0 | 22.0 | NaN | S |
1 | 38.0 | C85 | C |
2 | 26.0 | NaN | S |
3 | 35.0 | C123 | S |
4 | 35.0 | NaN | S |
… | … | … | … |
886 | 27.0 | NaN | S |
887 | 19.0 | B42 | S |
888 | NaN | NaN | S |
889 | 26.0 | C148 | C |
890 | 32.0 | NaN | Q |
891 rows × 3 columns
2.任务二:对缺失值进行处理
(1)处理缺失值一般思路
dropna
方法(删除)
官方文档:
fillna
方法(填充)
官方文档:
value:填空的值
method:怎样填空(如前面的值往后填,后面的值往前填)
(2) 对Age列的数据的缺失值进行处理
#用字典填充
df1 = df.fillna({'Age':0})
#法二
df[df['Age']==None]=0
(3) 使用不同的方法直接对整张表的缺失值进行处理
#法一:用0填充
df.fillna(value=0)
#将缺失值补0,一定要加inplace = True,这样才能让源数据发生改变并保存
#因为返回的是一个对象,不然的话就要用df=df.fillna(value=0)
运行结果
#法二,用前一个非空值进行填充
df3=df.fillna(method='ffill')
df3.isnull().sum()
#法三:用后一个非空值进行填充
df4=df.fillna(method='bfill')
df4.isnull().sum()
看到一个很好的fillna总结
【思考】
检索空缺值用np.nan
,None
以及.isnull()
哪个更好,这是为什么?如果其中某个方式无法找到缺失值,原因又是为什么?
缺省值判断 pd.isnull, pd.isna, pd.notna, pd.notnull, np.isnan, math.isnan 区别
二.重复值观察与处理
由于这样那样的原因,数据中会不会存在重复值呢,如果存在要怎样处理呢
1.任务一:查看数据中的重复值
dupicated
方法
data = pd.DataFrame({'k1': ['one', 'two'] * 3 + ['two'],
....: 'k2': [1, 1, 2, 3, 3, 4, 4]})
data
DataFrame的duplicated方法返回一个布尔型Series,表示各行是否是重复行(前面出现过的 行):
data.duplicated()
drop_duplicated方法
是对整个行有重复值的清理的方法
返回一个DataFrame,重复的数组会标为False
data.drop_duplicates()
返回一个DataFrame,重复的数组会标为False,你也可以指定部分列进行重复项判断
2.任务二:对重复值进行处理
(1)重复值的处理方式
见任务一:查看数据中的重复值
(2)处理我们数据的重复值
df.duplicated()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uehBWXJF-1626319431057)(https://cdn.jsdelivr.net/gh/xin007-kong/picture_new/img/20210715003553.png)]
此时还看不出来
df[df.duplicated()]
返回为空,本例子没有重复行
3.任务三:将前面清洗的数据保存为csv格式
df.to_csv('test_clear(practice).csv')
三.特征观察与处理
我们对特征进行一下观察,可以把特征大概分为两大类:
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征,数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析
1.任务一:对年龄进行分箱(离散化)处理
(1) 分箱操作是什么?
分箱操作就是将连续数据转换为分类对应物的过程。⽐如将连续的身⾼数据划分为:矮中⾼。
分箱操作也叫⾯元划分或者离散化
为了便于分析,连续数据常常被离散化或拆分为“面元”(bin)
(2) 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
df['Agecateg']=pd.cut(df['Age'],5,labels=['1','2','3','4','5'])#把新的一列存起来
df.head()
cut
重要参数:
x:所要处理的数据,必须是一维的
bins:如何分段,直接给数字,就是平均分段right:决定开闭区间
labels:给分段取名字,没写此参数会以区间显示
(3) 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示
df['Agecateg2']=pd.cut(df['Age'],[0,5,15,30,50,80],right=False,labels = ['1','2','3','4','5'])
right默认是左开右闭区间
左闭右开要right=False
验证时可以先把label去掉
(4) 将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示
qcut
df['Agecateg3']=pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels=['1','2','3','4','5'])
(5) 将上面的获得的数据分别进行保存,保存为csv格式
df.to_csv('test_cut(practice)')
2.任务二:对文本变量进行转换
文本型特征往往需要转换成数值型特征才能用于建模分析
(1) 查看文本变量名及种类
print(df_new['Sex'].value_counts())
print(df['Cabin'].value_counts())
print(df['Embarked'].value_counts())
运行结果
male 577
female 314
Name: Sex, dtype: int64
G6 4
C23 C25 C27 4
B96 B98 4
E101 3
D 3
..
D21 1
E63 1
C62 C64 1
A10 1
A32 1
Name: Cabin, Length: 147, dtype: int64
S 644
C 168
Q 77
Name: Embarked, dtype: int64
方法二
(2) 将文本变量Sex, Cabin ,Embarked用数值变量12345表示
df_new['Sex_num']=df_new['Sex'].map(lambda x: 1 if x=='female'else 2)
df_new['Sex_num']=df_new['Sex'].map(lambda x: 1 if x=='female'else 2)
df_new
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
lbl = LabelEncoder()
label_dict = dict(zip(df_new[feat].unique(), range(df_new[feat].nunique())))
df_new[feat + "_labelEncode"] = df_new[feat].map(label_dict)
df_new[feat + "_labelEncode"] = lbl.fit_transform(df_new[feat].astype(str))
df_new
(3) 将文本变量Sex, Cabin, Embarked用one-hot编码表示
one hot编码是将类别变量转换为机器学习算法易于利用的一种形式的过程
☞知乎回答
for feat in ["Age", "Embarked"]:
x = pd.get_dummies(df[feat], prefix=feat)
df_new = pd.concat([df, x], axis=1)
df_new.head()
3.任务三:从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)
df['Title'] = df.Name.str.extract('([A-Za-z]+)\\.', expand=False)
df.head()
这里用到了正则表达式
结:学校在上小学期,还没空调!热啊!!!!
以上是关于Datawhale7月组队学习task2数据清洗的主要内容,如果未能解决你的问题,请参考以下文章
Datawhale7月组队学习task1数据加载及探索性数据分析
java学习笔记1(datawhale教程):基本数据类型与变量