文章目录
- 一 数据清洗
- 1 缺失值观察与处理
- 1.1 缺失值观察
- 1.2 缺失值处理
- 2 重复值观察与处理
- 二 特征处理
- 1 分箱(离散化)处理
- 2 对文本变量进行转换
- 3 从纯文本Name特征里提取出Titles的特征
- 3 参考文章
一 数据清洗
- 数据清洗:我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗
1 缺失值观察与处理
1.1 缺失值观察
(1) 查看每个特征缺失值个数
-
df.isnull().sum()
-
df.info()
(2)查看指定列的数据 -
df[['Age','Cabin','Embarked']].head()
-
df.iloc[:,[6,10,11]].head(3)
-
df.loc[:,['Age','Cabin','Embarked']].head(3)
1.2 缺失值处理
(1)处理缺失值的几种思路
- 删除缺失值样本
- 可能值插补缺失值
(2)对Age列的数据的缺失值进行处理
令Age列数据的缺失值为0
- 判断是否为None
df[df['Age']==None]=0
df.head(3)
- 判断是否为np.nan
df[df['Age'] == np.nan] = 0
df.head(3)
- .isnull()
df[df['Age'].isnull()] = 0
df.head(3)
思考: 检索空缺值用np.nan,None以及 .isnull() 哪个更好,这是为什么?如果其中某个方式无法找到缺失值,原因又是为什么?
回答:检索空缺值用np.nan要比用None好,因为数值列读取数据后,空缺值的数据类型为float64所以用None一般索引不到,比较的时候最好用np.nan
(3)直接对整张表的缺失值进行处理
- 删除含缺失值的列:
df.dropna().head(3)
- 用0填充缺失值:
df.fillna(0).head(3)
思考: dropna和fillna有哪些参数,分别如何使用呢?
回答:
- dropna函数:将带有缺失值的数据使用dropna函数删除
DataFrame.dropna(axis=0,how=’any’,thresh=None,subset=None,inplace=False)
参数名称 | 说明 |
---|---|
axis | axis=0删除行,axis=1删除列,默认为0 |
how | ‘any’,和‘all’, 默认 ‘any’,any表示行或列中只要有一个缺失值就清除,all表示要整行都是缺失值才清除 |
thresh | thresh参数接受一个int值,表示保留有n个非空值的行或列 |
subset | subset参数接受一个集合作为值,可以是列表、元组、数组等,表示哪些列或行必须不能有空值,处于这些列或行的空值所处的行或列将被清除 |
inplace | inplace参数接受一个bool的值,表示是否在原数组上操作,如果值为True,那么返回None,并且直接对原数组进行缺失值的清理,否则就只返回一个copy |
- fillna函数:当缺失值所在的数据比较重要的时候,可能不适合删除,可以使用填充缺失值的方法
参数名称 | 说明 |
---|---|
axis | 接收0或1.表示轴向选择,默认为1 |
value | 表示用来替换缺失值的值 |
method | 取值为“backfill”或“bfill”时表示使用下一个非缺失值来填补缺失值。取值为“pad”或“ffill”是表示使用上一个非缺失值来填补缺失值 |
limit | 接收一个int。表示(每行或每列)填补缺失值个数上限,超过这个上限不再继续填补 |
inplace | 是否在原表上进行操作 |
参考链接:1 2
2 重复值观察与处理
(1)查看数据中的重复值
df[df.duplicated()]
-
观察重复值函数:
duplicated()
- 作用:查找并显示数据表中的重复值
-
用法1: 查询重复值的位置
# 查看Age列的重复值位置 df['Age'].duplicated()
用法2: 检查有多少重复值# 查看Age列的重复值位置 df.duplicated().sum() # 176
(2)重复值处理
-
重复值有哪些处理方式呢?
- 重复值一般采取删除法来处理,但有些重复值不能删除,例如订单明细数据或交易明细数据等
-
清除重复值:默认保留重复值的第一行
df = df.drop_duplicates()
-
清除重复值函数:
drop_duplicates()
- 格式:
DataFrame.drop_duplicates(subset=None, keep='first', inplace=False)
- 参数:
- subset: 列名,默认所有的列
- keep: 是否保留{‘first’, ‘last’, False}。
- 【默认】keep= ‘first’ 表示去重时每组重复数据保留第一条数据,其余数据丢弃;
- keep=‘last’ 表示去重时每组重复数据保留最后一条数据,其余数据丢弃;
- keep=False 表示去重时每组重复数据全部丢弃,不保留
- inplace: 是否替换{False, True},【默认】inplace=False表示去重之后不覆盖原表格数据,inplace=True表示去重之后原表格数据被覆盖
# 示例 df.drop_duplicates(keep='last') # 保留最后一行 df.drop_duplicates(keep=False) # 全部删除不保留 # 可以指定哪些字段重复视为重复值 df3.drop_duplicates(subset=['Age', 'Sex'])
- 格式:
(3)将清洗的数据保存为csv格式
df.to_csv('test_clear.csv')
二 特征处理
- 特征大概分为两类:
- 数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
- 文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征。
- 建模需要的特征:
数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。
1 分箱(离散化)处理
(1)分箱操作是什么?
数据分箱处理, 即把一段连续的值切分成若干段,每一段的值看成一个分类。通常把连续值转换成离散值的过程,我们称之为分箱处理。
- 具体解释:
简单点说就是将不同的东西,按照特定的条件放到一个指定容器里。
比如水果,把绿色的放一个篮子里,红色一个篮子等等,这个篮子就是箱,而水果就是数据,颜色就是条件
(2)为什么要分箱操作
在建模中,需要对连续变量离散化,特征离散化后,模型会更稳定,降低了模型过拟合的风险
(3)分箱操作
- 分箱类别:
- 有监督:就是个人确定范围区间
- 方法:python 中主要使用
cut
方法
- 方法:python 中主要使用
- 无监督:让代码自己划分组
- 方法:使用的是
qcut
方法
- 方法:使用的是
- 有监督:就是个人确定范围区间
cut()
函数- 格式:
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)
- 常用参数:
x
:类array对象,且必须为一维,待切割的原形式bins
: 整数、序列尺度、或间隔索引。如果bins是一个整数,它定义了x宽度范围内的等宽面元数量。如果bin是序列,它定义了允许非均匀in宽度的bin边缘right
:布尔值。是否是左开右闭区间labels
:用作结果箱的标签。必须与结果箱相同长度。如果FALSE,只返回整数指标面元
参考详细文章
- 格式:
(4)分箱操作实例
将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示,并保存为csv格式:
df['AgeBand'] = pd.cut(df['Age'], 5,labels = [1,2,3,4,5])
df.to_csv('test_ave.csv')
将连续变量Age划分为(0,5] (5,15] (15,30] (30,50] (50,80]五个年龄段,并分别用类别变量12345表示,并保存为csv格式:
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = [1,2,3,4,5])
df.to_csv('test_cut.csv')
将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示,并保存为csv格式:
df['AgeBand'] = pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
df.to_csv('test_pr.csv')
2 对文本变量进行转换
(1)查看文本变量名及种类
方法一:value_counts
df['Sex'].value_counts()
方法二: unique
df['Sex'].unique()
df['Sex'].nunique()
# 3
(2)用数值变量表示文本变量
【将类别文本转换为12345】
方法一: replace
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
df.head()
方法二: map
df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2})
df.head()
(3)将文本变量用one-hot编码表示
for feat in ["Age", "Embarked"]:
x = pd.get_dummies(df[feat], prefix=feat)
df = pd.concat([df, x], axis=1)
3 从纯文本Name特征里提取出Titles的特征
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)
df.head()
3 参考文章
关于链式赋值和这个警告可以看看这篇文章,讲的还挺清晰的~