【动手学数据分析】 Task02 - 数据清洗及特征处理

一、数据清洗

1. 缺失值

1.1 查看缺失值

方法一:df.info() 查看每列的详细信息
在这里插入图片描述
方法二:df.isnull().sum() 查看每列有效值个数
在这里插入图片描述

1.2 处理缺失值

具体问题具体分析,看缺失的数据是哪种类型的,再进行赋值处理。

常见的判断空值方法有:np.nan, None, .isnull()

例如数字类型,就可以将NAN赋值为0:

  • df[df['Age'] == None] = 0
  • df[df['Age'].isnull()] = 0
  • df[df['Age'] == np.nan] = 0

数值列读取的空数据,其类型为 float64,None 一般索引不到,此时使用 np.nan 较好。

另外的方法:.dropna(), .fillna()

# dropna() 方法
#
# axis:指定删除数据缺失为行或列;0为行,1为列,默认为0
# how:{‘any’, ‘all’}, default ‘any’;any 存在缺失数据就删除该行/列,all 全部为缺失数据才删除
# thresh:这一行除去NA值,剩余数值的数量大于等于thresh,就显示这一行
# subset:筛选
# inplace:是否在原对象基础上进行修改,当inplace=True时,函数返回值为None,否则返回DataFrame

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)


# fillna() 方法
#
# value:填充空数据的值;scalar, dict, Series, or DataFrame
# method:用于填充空数据的方法(向前,向后);{‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None
# axis:{0 or ‘index’, 1 or ‘columns’}
# inplace:是否在原对象基础上进行修改,当inplace=True时,函数返回值为None,否则返回DataFrame
# limit:向前或向后填充空数据的最大数目
# downcast:向下转换为适当的数据类型,如float64 到 int64

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)

例如:

  • df.dropna() 直接删除nan行数据1
  • df.fillna(0) 仅填充nan数据为指定数字

在这里插入图片描述

2. 重复值

2.1 查看重复值

查看重复值,使用 DataFrame.duplicated() 方法:
在这里插入图片描述

2.2 清理重复值

清理整行的重复值:DataFrame.drop_duplicates() 方法
清理重复值

清理完成后保存为csv格式:df.to_csv('test_clear.csv')

二、特征处理

首先观察数据的特征,可分为两大类:
特征的数据类型

1. 分箱(离散化)处理

分箱操作,顾名思义,就是对数据进行分装、拆分,即对其离散化处理。建模时对特征进行离散化处理,可增强模型的稳定性,同时也能降低过拟合出现的几率2

对年龄进行分箱操作

数据离散化的函数:pandas.cut()3, pandas.qcut()4

在这里插入图片描述
在这里插入图片描述

2. 转换文本类型变量

观察文本变量种类:

  • 方法一:计数 .value_counts()

    • 在这里插入图片描述
  • 方法二:.unique()

    • .nunique() 统计不同类型个数在这里插入图片描述

然后转换文本(本质是文本的替换):

2.1 Sex, Cabin, Embarked用 数值变量 表示的方法:

①:replace

在这里插入图片描述

②:map

在这里插入图片描述

③:sklearn.preprocessing 的 LabelEncoder

在这里插入图片描述

2.2 Sex, Cabin, Embarked用 one-hot 编码5 表示的方法:

One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,是分类变量作为二进制向量的表示,因此首先要求 将分类值映射到整数值

这里使用 OneHotEncoder
在这里插入图片描述

3. 提取Name中的Titles特征(Mr, Miss, Mrs等头衔)

df['Title'] = df.Name.str.extract('([A-Za-z]+)\.', expand=False)

提取头衔
提取出来的头衔可以进一步作为输入进行数据分析。


  1. 关于参数thresh的理解(pd.dropna(thresh=n))- 曾呀么曾开心 ↩︎

  2. 特征工程之分箱 - 糖甜甜甜74 ↩︎

  3. pandas.cut - pandas 1.3.3 documentation ↩︎

  4. pandas.qcut - pandas 1.3.3 documentation ↩︎

  5. 详解one-hot编码 - 帅帅的飞猪 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Beta Lemon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值