NLP-数据清洗常见步骤——以去哪儿网训练数据为例

数据清洗的常见步骤

Posted by Valuebai on September 5, 2019

1、导入相关的依赖包

import pandas as pd import numpy as np

2、读取数据

df = pd.read_csv(‘./input/qunar_freetrip.csv’, index_col=0)

  1. index_col 默认值(index_col = None)——重新设置一列成为index值
  2. index_col=False——重新设置一列成为index值
  3. index_col=0——第一列为index值

df.head()

3、数据的探索与描述

df.shape # 表示有0-5100行,0-13列

df.info()

#describe()函数只能显示数值型的数据统计,所以在这里只显示了2列 df.describe()

4、数据简单的处理

(1)列入将表中属性中的不规范定义进行简单的处理,例如:’价格 ‘出现空格

df.columns

将数组里的下标赋值给col变量

col = df.columns.values

去空格,第一种:以下的方法只能每次去除一次空格,有点繁琐

col[0].strip()

去空格,第二种:使用for循环来进行处理,如下:

df.columns = [x.strip() for x in col]

df.columns.values

5、重复数据的处理

(1)duplicated():显示重复值;返回布尔值类型 (2)drop_duplicates():删除重复值

df.duplicated()

df.duplicated().sum()

显示重复值的数据

df[df.duplicated()]

删除表中的重复值的数据

df.drop_duplicates(inplace=True)

df.duplicated().sum()

df.shape

我们发现重复的值已经被删除了,原来的数据是(5100,13)

现在我们要在原来的数据上,去重新将索引更改为有序

df.shape[0]

df.shape[1]

df.index #明显索引是无序的

排排序

df.index = range(df.shape[0])

df df.index

6、异常值的处理

在这里我们对“价格”和“节省”中出现的异常值进行处理 (1)对于建模来说,通常会删除异常值 (2)对于业务来说,异常值可能会包含很多的价值 (3)认为超过3倍标准差的数据,就认为这个数据是异常的

df.describe().T

明显发现max出现一个异常值179500.0

sta = (df[‘价格’] - df[‘价格’].mean())/df[‘价格’].std()

df[sta.abs()>3]

df[df.节省 > df.价格]

发现异常值一共有4条

pd.concat([df[df.节省 > df.价格], df[sta.abs() > 3]])

del_index = pd.concat([df[df.节省 > df.价格], df[sta.abs() > 3]]).index

df.drop(del_index, inplace=True)

df.shape

7、缺失值的处理

(1)df.isnull() 查看缺失值 (2)df.notnull() 查看不是缺失值 (3)df.dropnd() 删除缺失值 (4)df.fillna() 填补缺失值

df.isnull().sum()

df[df.出发地.isnull()]

df.loc[df.出发地.isnull(), ‘出发地’] = [str(x)[:2] for x in df.loc[df.出发地.isnull(),’路线名’]]

df[df.出发地.isnull()]

df.出发地.isnull().sum()

df[df.目的地.isnull()]

df.loc[df.目的地.isnull(), ‘目的地’] = str(df.loc[df.目的地.isnull(), ‘路线名’].values)[5:7]

df[‘价格’].fillna(round(df[‘价格’].mean(), 0), inplace= True)

df[‘节省’].fillna(round(df[‘节省’].mean(), 0), inplace = True)

在python3中round()函数做个改动,而且让人很难接受,所以现在用python2和python3来求round(2.5)会有不同的结果。python2给出的结果更接近大家通常的认识,下面是python2和3对round()函数的处理:

round(x)函数将一个浮点数x四舍五入为最近的1的倍数,如round(0.4)=0, round(0.6)=1.0; 如果x距离两个倍数值相等,如round(0.5)距离0和1.0相等,那么: python2把x四舍五入为远离0的最近倍数,如round(0.5)=1, round(-0.5)=-1; python3则会把x四舍五入为最近的偶数倍数,如round(0.5)=0, round(1.5)=2.0, round(2.5)=2.0

df.isnull().sum()

8、处理文本行数据

如果想要在一系列文本提取信息,使用正则表达式

df[‘酒店评分’] = df.酒店.str.extract(‘(\d.\d)分/5分’, expand=False) df[‘酒店等级’] = df.酒店.str.extract(‘ (.+ )’, expand=False) df[‘天数’] = df.路线名.str.extract(‘(\d+)天\d晚’, expand=False)

df.head(2)

【Me】https://github.com/Valuebai/

【参考】 1、出处:https://www.kesci.com/home/project/5cbd32248c90d7002c816fa0/code