数据清洗及特征处理 —— 泰坦尼克任务

2023-10-20 20:50

本文主要是介绍数据清洗及特征处理 —— 泰坦尼克任务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

熟悉的开始~

# 导入numpy和pandas
import pandas as pd
import numpy as np#加载数据train.csv
df = pd.read_csv('train.csv')
df

2.1 缺失值观察与处理

2.1.1 任务一:缺失值观察

(1) 请查看每个特征缺失值个数

# 查看数据内缺失值字段
df.info()
# 查看每个特征缺失值个数
df.isnull().sum()

info()用于打印DataFrame的简要摘要,显示有关DataFrame的信息,包括索引的数据类型dtype和列的数据类型dtype,非空值的数量和内存使用情况。

info()方法最后输出的是每列不为空的数量。也就是说如果有某列数据的数量比实际的索引数量要少,说明该列存在缺少值。

注意info()和describe()的区别:
describe()函数用于生成描述性统计信息。 描述性统计数据:数值类型的包括均值,标准差,最大值,最小值,分位数等;类别的包括个数,类别的数目,最高数量的类别及出现次数等;输出将根据提供的内容而有所不同。

(2) 请查看Age, Cabin, Embarked列的数据

# 查看Age, Cabin, Embarked列的数据 
df[['Age','Cabin','Embarked']] #  ['Age','Cabin','Embarked'] 作为索引标签

2.1.2 任务二:对缺失值进行处理

(1)处理缺失值一般有几种思路

  • 直接使用含有缺失值的特征
  • 删除含有缺失值的特征(该方法在包含缺失值的属性含有大量缺失值而仅仅包含极少量有效值时是有效的时候)
  • 缺失值补全

(2) 请尝试对Age列的数据的缺失值进行处理

  • 均值插补
  • 同类均值插补
  • 建模预测
  • 高维映射
  • 多重插补
  • 极大似然估计
  • 压缩感知和矩阵补全

(3) 请尝试使用不同的方法直接对整张表的缺失值进行处理

处理缺失值的一般思路:

  1. 删除
  2. 插补(重点)
  3. 不处理缺失值
    缺失值处理 —— 传送门
# 缺失值处理(方法一)
df[df['Age']==None]=0  # 空值部分未用“0”填充
# Age这一列的哪一行是空,就在Age那一列给它补上0
df

效果如下:

# 缺失值处理(方法二)
df = pd.read_csv('train.csv')
df[df['Age'].isnull()] = 0 # 可行操作  空值部分用“0”来填充
df

效果如下:
在这里插入图片描述

# 缺失值处理(方法三)
df = pd.read_csv('train.csv')
df[df['Age'] == np.nan] = 0  # 空值部分未用“0”填充
df

效果如下:
在这里插入图片描述

# 缺失值处理(方法四)
df = pd.read_csv('train.csv')
df[df['Age'].isna()] = 0 # 可行操作  空值部分用“0”来填充
df

效果如下:
在这里插入图片描述

# 丢弃含空值的行、列
df.dropna()
# 用0来填充缺失值
df = pd.read_csv('train.csv')
df.fillna(0)

【思考1】dropna和fillna有哪些参数,分别如何使用呢?
【思考1回答】

dropna()方法-丢弃含空值的行、列
函数形式:dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)
参数:
axis:轴。0或’index’,表示按行删除;1或’columns’,表示按列删除。
how:筛选方式。‘any’,表示该行/列只要有一个以上的空值,就删除该行/列;‘all’,表示该行/列全部都为空值,就删除该行/列。
thresh:非空元素最低数量。int型,默认为None。如果该行/列中,非空元素数量小于这个值,就删除该行/列。
subset:子集。列表,元素为行或者列的索引。如果axis=0或者‘index’,subset中元素为列的索引;如果axis=1或者‘column’,subset中元素为行的索引。由subset限制的子区域,是判断是否删除该行/列的条件判断区域。
inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。

fillna()方法-填充空值
函数形式:fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
参数:
value:用于填充的空值的值。
method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None。定义了填充空值的方法, pad / ffill表示用前面行/列的值,填充当前行/列的空值, backfill / bfill表示用后面行/列的值,填充当前行/列的空值。
axis:轴。0或’index’,表示按行删除;1或’columns’,表示按列删除。
inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。
limit:int, default None。如果method被指定,对于连续的空值,这段连续区域,最多填充前 limit 个空值(如果存在多段连续区域,每段最多填充前 limit 个空值)。如果method未被指定, 在该axis下,最多填充前 limit 个空值(不论空值连续区间是否间断)
downcast:dict, default is None,字典中的项为,为类型向下转换规则。或者为字符串“infer”,此时会在合适的等价类型之间进行向下转换,比如float64 to int64 if possible。
注:fillna(0) 用0来填充缺失值

【思考】检索空缺值用np.nan,None以及.isnull()哪个更好,这是为什么?如果其中某个方式无法找到缺失值,原因又是为什么?
【思考回答】Pandas 主要用 np.nan 表示缺失数据。 计算时,默认不包含空值。数值列读取数据后,空缺值的数据类型为float64所以用None一般索引不到。

2.2 重复值观察与处理

2.2.1 任务一:请查看数据中的重复值

# 查看数据中的重复值
df[df.duplicated()]

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

# 对整个行有重复值的清理的方法
df = df.drop_duplicates()
df.head()

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

# 将前面清洗的数据保存为csv格式
df.to_csv('test_clear.csv')

2.3 特征观察与处理

我们对特征进行一下观察,可以把特征大概分为两大类:
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征。
文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征,数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。

2.3.1 任务一:对年龄进行分箱(离散化)处理

(1) 分箱操作是什么?

分箱操作就是将连续数据转换为分类对应物的过程。简单点说就是将不同的东西,按照特定的条件放到一个指定容器里,比如分水果,把绿色的放一个篮子里,红色一个篮子等等,这个篮子就是箱,而水果就是数据, 其中颜色就是条件
分箱操作分为等距分箱和等频分箱。
分箱操作也叫⾯元划分或者离散化。

(2) 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示

#将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'], 5,labels = [1,2,3,4,5])
df.head()
df.to_csv('test_ave.csv')

(3) 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示

#将连续变量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()
df.to_csv('test_cut.csv')
#将连续变量Age划分为(0,5] (5,15] (15,30] (30,50] (50,80]五个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],right = False)
df.head()

(4) 将连续变量Age按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示

#将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
df['AgeBand'] = pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])
df.head()
df.to_csv('test_pr.csv')

2.3.2 任务二:对文本变量进行转换

(1) 查看文本变量名及种类

# 查看类别文本变量名及种类
# 方法一: value_counts
df['Sex'].value_counts() # 查看'Sex'列中的变量及种类
df['Cabin'].value_counts() # 查看'Cabin'列中的变量及种类
df['Embarked'].value_counts() # 查看'Embarked'列中的变量及种类#方法二: unique
df['Sex'].unique()
df['Sex'].nunique()

value_counts常用于数据表的计数及排序,它可以用来查看数据表中,指定列里有多少个不同的数据值,并计算每个不同值有在该列中的个数,同时还能根据需要进行排序.
unique 函数 统计list中的不同值
nunique 函数 可直接统计dataframe中每列的不同值的个数

(2) 将文本变量Sex, Cabin ,Embarked用数值变量12345表示

# 将文本变量Sex, Cabin ,Embarked用数值变量12345表示
#方法一: replace
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2],inplace = True)
df.head()#方法二: map
df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2})
df.head()#方法三 (文本变量转换成数组变量)
from sklearn.preprocessing import LabelEncoder
df['Cabin'] = LabelEncoder().fit_transform(df['Cabin'])
df['Embarked'] = LabelEncoder().fit_transform(df['Embarked'])
df.head()#方法四: 使用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.head()

replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串)
map()函数会将指定的函数依次作用于某个序列的每个元素,并返回一个迭代器对象

(3) 将文本变量Sex, Cabin, Embarked用one-hot编码表示

for column in ['Cabin', 'Embarked']:
x = pd.get_dummies(df[column], prefix=[column]) # one-hot编码表示
df = pd.concat([df,x],axis = 1) # 按列拼接
df.head()
# 将文本变量Sex, Cabin, Embarked用one-hot编码表示
#方法: OneHotEncoder
for feat in ["Age", "Embarked"]:
#     x = pd.get_dummies(df["Age"] // 6)
#     x = pd.get_dummies(pd.cut(df['Age'],5))x = pd.get_dummies(df[feat], prefix=feat)df = pd.concat([df, x], axis=1)#df[feat] = pd.get_dummies(df[feat], prefix=feat)df.head()

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

# 从纯文本Name特征里提取出Titles的特征(所谓的Titles就是Mr,Miss,Mrs等)
df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)  # 正则表达式进行提取
df.head()
# 保存上面的为最终结论
df.to_csv('test_fin.csv')

总结

本节课学习掌握了对于存在缺失值、重复值、异常值数据的处理及所谓的数据清洗,同时了解如何对特征进行观察与处理,通常可以采取分箱(离散化)处理、将文本型特征转换成数值型特征或对文本字段特征进行提取等等操作。

这篇关于数据清洗及特征处理 —— 泰坦尼克任务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/249633

相关文章

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

Python自动化处理PDF文档的操作完整指南

《Python自动化处理PDF文档的操作完整指南》在办公自动化中,PDF文档处理是一项常见需求,本文将介绍如何使用Python实现PDF文档的自动化处理,感兴趣的小伙伴可以跟随小编一起学习一下... 目录使用pymupdf读写PDF文件基本概念安装pymupdf提取文本内容提取图像添加水印使用pdfplum

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过