python异常值处理_3.1 数据清洗:缺失值、异常值和重复值的处理-2代码实操

说明:本文是《Python数据分析与数据化运营》中的“3.1 数据清洗:缺失值、异常值和重复值的处理-2 代码实操部分”。

—————————–下面是正文内容————————–

缺失值处理

对于缺失值的处理上,主要配合使用sklearn.preprocessing中的Imputer类、Pandas和Numpy。其中由于Pandas对于数据探索、分析和探查的支持较为良好,因此围绕Pandas的缺失值处理较为常用。

import pandas as pd # 导入pandas库

import numpy as np # 导入numpy库

from sklearn.preprocessing import Imputer # 导入sklearn.preprocessing中的Imputer库

# 生成缺失数据

df = pd.DataFrame(np.random.randn(6, 4), columns=['col1', 'col2','col3', 'col4']) # 生成一份数据

df.iloc[1:2, 1] = np.nan # 增加缺失值

df.iloc[4, 3] = np.nan # 增加缺失值

print (df)

# 查看哪些值缺失

nan_all = df.isnull() # 获得所有数据框中的N值

print (nan_all) # 打印输出

# 查看哪些列缺失

nan_col1 = df.isnull().any() # 获得含有NA的列

nan_col2 = df.isnull().all() # 获得全部为NA的列

print (nan_col1) # 打印输出

print (nan_col2) # 打印输出

# 丢弃缺失值

df2 = df.dropna() # 直接丢弃含有NA的行记录

print (df2) # 打印输出

# 使用sklearn将缺失值替换为特定值

nan_model = Imputer(missing_values='NaN', strategy='mean',axis=0) # 建立替换规则:将值为Nan的缺失值以均值做替换

nan_result = nan_model.fit_transform(df) # 应用模型规则

print (nan_result) # 打印输出

# 使用pandas将缺失值替换为特定值

nan_result_pd1 = df.fillna(method='backfill') # 用后面的值替换缺失值

nan_result_pd2 = df.fillna(method='bfill', limit=1) # 用后面的值替代缺失值,限制每列只能替代一个缺失值

nan_result_pd3 = df.fillna(method='pad') # 用前面的值替换缺失值

nan_result_pd4 = df.fillna(0) # 用0替换缺失值

nan_result_pd5 = df.fillna({'col2': 1.1, 'col4': 1.2}) # 用不同值替换不同列的缺失值

nan_result_pd6 = df.fillna(df.mean()['col2':'col4']) # 用平均数代替,选择各自列的均值替换缺失值

# 打印输出

print (nan_result_pd1) # 打印输出

print (nan_result_pd2) # 打印输出

print (nan_result_pd3) # 打印输出

print (nan_result_pd4) # 打印输出

print (nan_result_pd5) # 打印输出

print (nan_result_pd6) # 打印输出

上述代码以空行分为6个部分。

第一部分为导入库,该代码示例中用到的Pandas、Numpy和sklearn。

第二部分生成缺失数据,通过Pandas生成一个6行4列,列名分别为’col1′, ‘col2′,’col3’, ‘col4’的数据框。同时,数据框中增加两个缺失值数据。除了示例中直接通过pd.DataFrame来直接创建数据框外,还可以使用数据框对象的df.from_records、df.from_dict、df.from_items来从元组记录、字典和键值对对象创建数据框,或使用pandas.read_csv、pandas.read_table、pandas.read_clipboard等方法读取文件或剪贴板创建数据框。该代码段执行后返回了定义的含有缺失值的数据框,结果如下:

col1 col2 col3 col4

0 -0.112415 -0.768180 -0.084859 0.296691

1 -1.777315 NaN -0.166615 -0.628756

2 -0.629461 1.892790 -1.850006 0.157567

3 0.544860 -1.230804 0.836615 -0.945712

4 0.703394 -0.764552 -1.214379 NaN

5 1.928313 -1.376593 -1.557721 0.289643

第三部分通过df.null()方法找到所有数据框中的缺失值(默认缺失值是NaN格式),然后使用any()或all()方法来查找含有至少1个或全部缺失值的列,其中any()方法用来返回指定轴中的任何元素为True,而all()方法用来返回指定轴的所有元素都为True。该代码段执行后返回如下结果:

判断元素是否是缺失值(第2行第2列和第5行第4列):

col1 col2 col3 col4

0 False False False False

1 False True False False

2 False False False False

3 False False False False

4 False False False True

5 False False False False

列出至少有一个元素含有缺失值的列(该示例中为col2和col4)

col1 False

col2 True

col3 False

col4 True

dtype: bool

列出全部元素含有缺失值的列(该示例中没有)

col1 False

col2 False

col3 False

col4 False

dtype: bool

第四部分通过Pandas默认的dropna()方法丢弃缺失值,返回无缺失值的数据记录。该代码段执行后返回如下结果(第2行、第5行数据记录被删除):

col1 col2 col3 col4

0 -0.112415 -0.768180 -0.084859 0.296691

2 -0.629461 1.892790 -1.850006 0.157567

3 0.544860 -1.230804 0.836615 -0.945712

5 1.928313 -1.376593 -1.557721 0.289643

第五部分通过sklearn的数据预处理方法对缺失值进行处理。首先通过Imputer方法创建一个预处理对象,其中strategy为默认缺失值的字符串,默认为NaN;示例中选择缺失值替换方法是均值(默认),还可以选择使用中位数和众数进行替换,即strategy值设置为median或most_frequent;后面的参数axis用来设置输入的轴,默认值为0,即使用列做计算逻辑。然后使用预处理对象的fit_transform方法对df(数据框对象)进行处理,该方法是将fit和transform组合起来使用。代码执行后返回如下结果:

[[-0.11241503 -0.76818022 -0.08485904 0.29669147]

[-1.77731513 -0.44946793 -0.16661458 -0.62875601]

[-0.62946127 1.89278959 -1.85000643 0.15756702]

[ 0.54486026 -1.23080434 0.836615 -0.9457117 ]

[ 0.70339369 -0.76455205 -1.21437918 -0.16611331]

[ 1.92831315 -1.37659263 -1.55772092 0.28964265]]

代码中的第2行第2列和第5行第4列分别被各自列的均值替换。为了验证我们手动计算一下各自列的均值,通过使用df[‘col2’].mean()和df[‘col4’].mean()分别获得这两列的均值为-0.4494679289032068和-0.16611331259664791,跟sklearn返回的结果一致。

第六部分使用Pandas做缺失值处理。Pandas对缺失值的处理方法是df.fillna(),该方法中最主要的两个参数是value和method。前者通过固定(或手动指定)的值替换缺失值,后者使用Pandas提供的默认方法替换缺失值,以下是method支持的方法:

pad和ffill:使用前面的值替换缺失值,示例中nan_result_pd1和nan_result_pd2使用了该方法。

backfill和bfill:使用后面的值替换缺失值,示例中nan_result_pd3使用了该方法。

None:无

在示例中nan_result_pd4、nan_result_pd5、nan_result_pd6分别使用0、不同的值、平均数替换缺失值。需要注意的是,如果要使用不同具体值替换,需要使用scalar、dict、Series或DataFrame的格式定义。

上述代码执行后返回如下结果:

用后面的值(method=’backfill’)替换缺失值,

col1 col2 col3 col4

0 -0.112415 -0.768180 -0.084859 0.296691

1 -1.777315 1.892790 -0.166615 -0.628756

2 -0.629461 1.892790 -1.850006 0.157567

3 0.544860 -1.230804 0.836615 -0.945712

4 0.703394 -0.764552 -1.214379 0.289643

5 1.928313 -1.376593 -1.557721 0.289643

用后面的值(method=’bfill’, limit = 1)替换缺失值,

col1 col2 col3 col4

0 -0.112415 -0.768180 -0.084859 0.296691

1 -1.777315 1.892790 -0.166615 -0.628756

2 -0.629461 1.892790 -1.850006 0.157567

3 0.544860 -1.230804 0.836615 -0.945712

4 0.703394 -0.764552 -1.214379 0.289643

5 1.928313 -1.376593 -1.557721 0.289643

用前面的值替换缺失值(method=’pad’)

col1 col2 col3 col4

0 -0.112415 -0.768180 -0.084859 0.296691

1 -1.777315 -0.768180 -0.166615 -0.628756

2 -0.629461 1.892790 -1.850006 0.157567

3 0.544860 -1.230804 0.836615 -0.945712

4 0.703394 -0.764552 -1.214379 -0.945712

5 1.928313 -1.376593 -1.557721 0.289643

用0替换缺失值

col1 col2 col3 col4

0 -0.112415 -0.768180 -0.084859 0.296691

1 -1.777315 0.000000 -0.166615 -0.628756

2 -0.629461 1.892790 -1.850006 0.157567

3 0.544860 -1.230804 0.836615 -0.945712

4 0.703394 -0.764552 -1.214379 0.000000

5 1.928313 -1.376593 -1.557721 0.289643

手动指定两个缺失值分布为1.1和1.2

col1 col2 col3 col4

0 -0.112415 -0.768180 -0.084859 0.296691

1 -1.777315 1.100000 -0.166615 -0.628756

2 -0.629461 1.892790 -1.850006 0.157567

3 0.544860 -1.230804 0.836615 -0.945712

4 0.703394 -0.764552 -1.214379 1.200000

5 1.928313 -1.376593 -1.557721 0.289643

用平均数代替,选择各自列的均值替换缺失值

col1 col2 col3 col4

0 -0.112415 -0.768180 -0.084859 0.296691

1 -1.777315 -0.449468 -0.166615 -0.628756

2 -0.629461 1.892790 -1.850006 0.157567

3 0.544860 -1.230804 0.836615 -0.945712

4 0.703394 -0.764552 -1.214379 -0.166113

5 1.928313 -1.376593 -1.557721 0.289643

以上示例中,直接指定method的方法适用于大多数情况,较为简单直接;但使用value的方法则更为灵活,原因是可以通过函数的形式将缺失值的处理规则写好,然后直接赋值即可。限于篇幅不对所有方法做展开讲解。

另外,如果是直接替换为特定值的应用,也可以考虑使用Pandas的replace功能。本示例的df(原始数据框),可直接使用df.replace(np.nan,0),这种用法更加简单粗暴,但也能达到效果。当然,replace的出现是为了解决各种替换应用的,缺失值只是其中的一种应用而已。

上述过程中,主要需要考虑的关键点是:

缺失值的替换策略,可指定多种方法替换缺失值,具体根据实际需求而定,但大多数情况下均值、众数和中位数的方法较为常用。如果场景固定,也可以使用特定值(例如0)替换。

异常值处理

有关异常值的确定有很多规则和方法,这里使用Z标准化得到的阀值作为判断标准:当标准化后的得分超过阀值则为异常。完整代码如下:

import pandas as pd # 导入pandas库

# 生成异常数据

df = pd.DataFrame({'col1': [1, 120, 3, 5, 2, 12, 13],'col2':[12, 17, 31, 53, 22, 32, 43]})

print (df) # 打印输出

# 通过Z-Score方法判断异常值

df_zscore = df.copy() # 复制一个用来存储Z-score得分的数据框

cols = df.columns # 获得数据框的列名

for col in cols: # 循环读取每列

df_col = df[col] # 得到每列的值

z_score = (df_col - df_col.mean()) / df_col.std() # 计算每列的Z-score得分

df_zscore[col] = z_score.abs() > 2.2 # 判断Z-score得分是否大于2.2,如果是则是True,否则为False

print (df_zscore) # 打印输出

示例代码以空行分为3个部分:

第一部分导入本例需要的Pandas库。

第二部分生成异常数据。直接通过DataFrame创建一个7行2列的数据框,打印输出结果如下:

col1 col2

0 1 12

1 120 17

2 3 31

3 5 53

4 2 22

5 12 32

6 13 43

第三部分为缺失值判断过程。本过程中,先通过df.copy()复制一个原始数据框的副本用来存储Z-Score标准化后的得分,再通过df.columns获得原始数据框的列名,接着通过循环判断每一列中的异常值。在判断逻辑中,对每一列的数据进行使用自定义的方法做Z-Score值标准化得分计算,然后跟阀值2.2做比较,如果大于阀值则为异常。标准化的计算还有更多自动化的方法和场景,有关数据标准化的话题,将在“3.9标准化,让运营数据落入相同的范围”中具体介绍。本段代码返回结果如下:

col1 col2

0 False False

1 True False

2 False False

3 False False

4 False False

5 False False

6 False False

本示例方法中,阀值的设定是确定异常与否的关键,通常当阀值大于2时,已经是相对异常的表现值。

上述过程中,主要需要考虑的关键点是:

q 如何判断异常值。对于有固定业务规则的可直接套用业务规则,而对于没有固定业务规则的,可以采用常见的数学模型进行判断:基于概率分布的模型(例如正态分布的标准差范围)、基于聚类的方法(例如KMeans)、基于密度的方法(例如LOF)、基于分类的方法(例如KNN)、基于统计的方法(例如分位数法)等,异常值的定义带有较强的主观判断色彩,具体需要根据实际情况选择。

重复值处理

有关重复值的处理代码示例如下:

import pandas as pd # 导入pandas库

# 生成重复数据

data1 = ['a', 3]

data2 = ['b', 2]

data3 = ['a', 3]

data4 = ['c', 2]

df = pd.DataFrame([data1, data2, data3, data4], columns=['col1',

'col2'])

print (df)

# 判断重复数据

isDuplicated = df.duplicated() # 判断重复数据记录

print (isDuplicated) # 打印输出

# 删除重复值

new_df1 = df.drop_duplicates() # 删除数据记录中所有列值相同的记录

new_df2 = df.drop_duplicates(['col1']) # 删除数据记录中col1值相同的记录

new_df3 = df.drop_duplicates(['col2']) # 删除数据记录中col2值相同的记录

new_df4 = df.drop_duplicates(['col1', 'col2']) # 删除数据记录中指定列(col1/col2)值相同的记录

print (new_df1) # 打印输出

print (new_df2) # 打印输出

print (new_df3) # 打印输出

print (new_df4) # 打印输出

上述代码以空行分为4个部分:

第一部分为导入用到的Pandas库。

第二部分生成重复数据,该数据是一个4行2列数据框,数据结果如下:

col1 col2

0 a 3

1 b 2

2 a 3

3 c 2

第三部分判断数据记录是否为重复值,返回每条数据记录是否重复结果,取值为True或False。判断方法为df.duplicated(),该方法中两个主要的参数是subset和keep:

subset:要判断重复值的列,可以指定特定列或多个列。默认使用全部列。

keep:当重复时不标记为True的规则,可设置为第一个(first)、最后一个(last)和全部标记为True(False)。默认使用first,即第一个重复值不标记为True。

结果如下:

0 False

1 False

2 True

3 False

dtype: bool

第四部分为删除重复值的操作。该操作的核心方法是df.drop_duplicates(),该方法的作用是基于指定的规则判断为重复值之后,删除重复值,其参数跟df.duplicated()完全相同。在该部分方法示例中,依次使用默认规则(全部列相同的数据记录)、col1列相同、col2列相同以及指定col1和col2完全相同四种规则进行去重。返回结果如下:

删除数据记录中所有列值相同的记录

col1 col2

0 a 3

1 b 2

3 c 2

删除数据记录中col1值相同的记录

col1 col2

0 a 3

1 b 2

3 c 2

删除数据记录中col2值相同的记录

col1 col2

0 a 3

1 b 2

删除数据记录中指定列(col1和col2)值相同的记录

col1 col2

0 a 3

1 b 2

3 c 2

提示 由于数据是通过随机数产生,因此读者操作的结果可能跟上述示例的数据结果不同。

除了Pandas可用来做重复值判断和处理外,也可以使用Numpy中的unique()方法,该方法返回其参数数组中所有不同的值,并且按照从小到大的顺序排列。Python自带的内置函数set方法,也能返回唯一元素的集合。

上述过程中,主要需要考虑的关键点是:

如何对重复值进行处理。重复值的判断相对简单,而判断之后如何处理往往不是一个技术特征明显的工作,而是侧重于业务和建模需求的工作。

代码实操小结:本小节示例中,主要用了几个知识点:

通过pd.DataFrame新建数据框

通过df.iloc[]来选择特定的列或对象

使用pandas的isnull()判断值是否为空

使用all()和any()判断每列是否包含至少1个为True或全部为True的情况

使用pandas的dropna()直接删除缺失值

使用sklearn.preprocessing中的Imputer方法对缺失值进行填充和替换,支持3种填充方法

使用pandas的fillna填充缺失值,支持更多自定义的值和常用预定义方法

通过copy()获得一个对象副本,常用于原始对象和复制对象同时进行操作的场景

通过for循环遍历可迭代的列表值

自定义了Z-Score计算公式

通过pandas的duplicated()判断重复数据记录

通过pandas的drop_duplicates()删除数据记录,可指定特定列或全部

====================【好书推荐,我为自己代言】====================

《Python数据分析与数据化运营》第二版上市啦!

50+数据流工作知识点14个数据分析与挖掘主题8个综合性运营分析案例涵盖会员、商品、流量、内容4大主题360°把脉运营问题并贴合数据场景落地

本书主要基于Python实现,其中主要用到的计算库是numpy、pandas和sklearn,其他相关库还包括:

标准库:re、time、datetime、json、 base64、os、sys、cPickle、tarfile

Python调用R的rpy2

统计分析:Statsmodels

中文处理:结巴分词

文本挖掘:Gensim

数据挖掘和算法:XGboost、gplearn、TPOT

爬虫和解析:requests、Beautiful Soup、xml

图像处理:OpenCV和PIL/Pollow

数据读取:xlrd、pymongo、pymysql

数据预处理:imblearn

展示美化类:Matplotlib、pyecharts、graphviz、prettytable、wordcloud、mpl_toolkits、pydotplus

如果你对以下内容感兴趣,那么本书将值得一看:

KMeans聚类的自动K均值的确立方法

基于软方法的多分类模型组合评估模型的应用

基于自动下探(下钻、细分)的应用

基于增量学习的多项式贝叶斯分类

pipeline管道技术的应用

基于超参数的自动参数值的优化方法

特征自动选择

文本分类、文本主题挖掘

基于自动时间序列ARIMA的P、D、Q的调整

python决策树规则输出

基于自定义图像的文本标签云

非结构化数据,例如图像、音频、文本等处理

对象持久化处理

如何使用Python调用R实现数据挖掘

自动化学习:增加了对于自动化数据挖掘与机器学习的理论、流程、知识和应用库介绍,并基于TPOT做自动化回归和分类学习案例演示

有关这本书的写作感受、详细内容介绍、附件(含数据和代)下载、关键知识和方法以及完整书稿目录,请访问《Python数据分析与数据化运营》第二版出版了!要购买此书,可以去京东、当当和天猫等查看。

第二版封面2.jpg

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值