Python数据分析(2)——数据清洗及特征处理

  • 数据清洗
  • 导入数据
  • 1.缺失值
  • 1.1缺失值的查询
  • 1.2 缺失值的处理
  • 1.2.1利用dropna处理
  • 1.2.2 利用fillna处理
  • 2 重复值
  • 2.1查看重复值
  • 2.2 处理重复值
  • 特征处理
  • 1.离散化处理
  • 2.将文本数据转换
  • 2.1利用value_counts函数查看数据类别
  • 2.2 利用map函数转换数据类型
  • 2.3将类别文本转换为one-hot编码
  • 友情链接



本文延续使用

kaggle泰坦尼克号数据。

数据清洗

对于我们拿到的原数据来说,它们常常含有一些异常值、缺失值、重复值,数据类型也是多种多样,不能用于直接分析,需要经过一定的预处理才能继续进行建模或分析。

导入数据

#加载所需的库
import numpy as np
import pandas as pd

#加载数据train.csv
data = pd.read_csv('train.csv')
data.head(3)

python中str清理 python数据清洗_python

1.缺失值

1.1缺失值的查询

#(1)通过info或describe查询
data.info()
#data.describe()
#(2)通过isnull函数实现操作
data.isnull()#返回一个bool类型判断矩阵,缺失为True,存在为False

data.isnull().sum()#常用isnull.sum()直接返回缺失值个数
data.isnull().any()#若有缺失值(空)的列,则该列返回True,否则为False

#清楚显示缺失值的行列
data[data.isnull().values==True]#可以指定特定的行列

python中str清理 python数据清洗_缺失值_02

1.2 缺失值的处理

缺失值的处理,我们常用pandas的**fillna()dropna()**函数

#检索特定列缺失值
#data[data['Age']==None]=0
#data[data['Age'].isnull()] = 0
data[data['Age'] == np.nan] = 0
data.head()
#这里有三种方法检索缺失值,但用最后一种较好,在numpy中nan或NAN的类型属于一种规定的特殊浮点数之一
#在读取数值列时,空缺值的数据类型为float64,用None一般索引不到,所以nan较好
1.2.1利用dropna处理
  • axis : 0为行 1为列,default 0,数据删除维度
  • how :{‘any’, ‘all’}, any:删除带有nan的行;all:删除全为nan的行
  • thresh : int,保留至少 int 个非nan行
  • subset:list,在特定列缺失值处理
  • inplace : bool,是否修改源文件
#调用函数
data.dropna()
data.head()

python中str清理 python数据清洗_数据挖掘_03

1.2.2 利用fillna处理
  • value : 固定值填充
  • method :‘ffill’ 用前一个非空缺值填充;‘bfill’ 用后一个非空缺值填充
  • axis:‘index’:按行填充;'columns’按列填充
  • inplace : 是否用新生成的列表替换原列表
#例如:用零填充所有缺失值
data.fillna(0).head(3)

#可以用数据均值(最大值、最小值、三次样条插值)
data['Age'].fillna(value = data['Age'].mean())#此处为举例,实际年龄缺失值的填充并非如此

python中str清理 python数据清洗_python中str清理_04

2 重复值

2.1查看重复值

#此处较为简单,同前一种相似,调用duplicated函数
data[data.duplicated()]

2.2 处理重复值

这里用到drop_duplicates函数

  • subset: 列标签,可选
  • keep: {‘first’, ‘last’, False}, 默认值 ‘first’
    first:保留第一次出现的重复项
    last: 删除重复项,仅保留最后一次出现的重复项
    False: 删除所有重复项
  • inplace:布尔值,默认为False,是否删除重复项或返回副本
#subset设置为None的时候,默认所有列,意思是所有列同时(即:完全一样的两行)为重复的时候才删除。
data = df.drop_duplicates()
data.head()
#保存数据
data.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.离散化处理

数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。

对于某些数据,如年龄、消费金额等,常常采取离散化的处理方式,及将数据分段,常用cut函数。

  • series :类似数组排列,必须是一维的
  • bins:表示分段数或分类区间,可以是数字,比如说4,就是分成4段,也可以是列表,表示各段的间隔点)
  • right=True:表示分组右边闭合,right=False表示分组左边闭合
  • labels :表示结果标签,一般最好添加,方便阅读和后续统计
#将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
data['AgeBand'] = pd.cut(data['Age'], 5,labels = [1,2,3,4,5])

#或指定区间(0,5] (5,15] (15,30] (30,50] (50,80]
#data['AgeBand'] = pd.cut(data['Age'], [0,5,15,30,50,80],labels = [1,2,3,4,5])

#或指定百分比10% 30% 50 70% 90%
#data['AgeBand'] = pd.cut(data['Age'], [0,0.1,0.3,0.5,0.7,0.9],labels = [1,2,3,4,5])

data.head()

python中str清理 python数据清洗_数据分析_05

2.将文本数据转换

处理文本数据的方式有多种

2.1利用value_counts函数查看数据类别

value_counts(values,sort=True, ascending=False, normalize=False,bins=None,dropna=True)
  • sort=True: 是否要进行排序;默认进行排序
  • ascending=False: 默认降序排列
  • normalize=False: 是否要对计算结果进行标准化并显示标准化后的结果,默认是False
  • bins=None:可以自定义分组区间,默认是否 dropna=True:是否删除缺失值nan,默认删除
data['Sex'].value_counts()
#data['Cabin'].value_counts()
#data['Embarked'].value_counts()

python中str清理 python数据清洗_缺失值_06

2.2 利用map函数转换数据类型

map(insert function here, insert iterable here)

第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个集合

#我们常常利用for来遍历元素并将其填入列表中,但这种方法远不及map有效并且减少内存
data['Sex_num'] = data['Sex'].map({'male': 1, 'female': 2})
data.head()

python中str清理 python数据清洗_python_07

2.3将类别文本转换为one-hot编码

这里利用pandas.get_dummies函数(返回结果的独热编码矩阵)

p = pd.get_dummies(data['Embarked'] , prefix = 'Embarked')#指定特定的列进行转换,prefix加上一段前缀
data = pd.concat([data,p],axis = 1)#将结果与数据拼接起来
data.head()

python中str清理 python数据清洗_python中str清理_08


本文就先到这里叭