Python数据清洗:处理缺失值、异常值和重复值

liftword5个月前 (01-10)技术文章47

在Python数据分析中,数据清洗是一个非常重要的步骤。数据清洗包括处理缺失值、异常值和重复值,以及进行数据转换和归一化等操作。本文将介绍如何使用Python进行数据清洗,并提供相应的代码示例。

1.缺失值处理

缺失值是指数据集中某些数据项的值为空或未知。在数据分析中,通常需要对缺失值进行处理。以下是一些常用的处理方法:

1.1 删除含有缺失值的行或列

可以使用pandas库中的dropna()函数删除含有缺失值的行或列。例如:


import pandas as pd

data = pd.DataFrame({'A': [1, 2, None], 'B': [4, None, 6]})
data = data.dropna()
print(data)

输出结果为:


     A    B
0  1.0  4.0
1  2.0  NaN
2  NaN  6.0
     A    B
0  1.0  4.0

如上所示,可以看到,含有缺失值的行被删除了。

1.2 用平均值或众数填充缺失值

可以使用pandas库中的fillna()函数用平均值或众数填充缺失值。例如:


import pandas as pd

data = pd.DataFrame({'A': [1, 2, None], 'B': [4, None, 6]})
data['A'] = data['A'].fillna(data['A'].mean())
data['B'] = data['B'].fillna(data['B'].mode()[0])
print(data)

data['B'].mode()表示:计算 'B' 列中的众数,即出现次数最多的值。mode() 方法返回一个包含众数的 Series。最后 data['B'].mode()[0]表示从众数的 Series 中选择第一个值,即取得列 'B' 中出现频率最高的值。 输出结果为:


     A    B
0  1.0  4.0
1  2.0  4.0
2  1.5  6.0

可以看到,缺失值被用平均值填充了。上面两处代码的具体运行截图如下所示。

2.异常值处理

异常值是指数据集中与大多数数据不同的离群点。在数据分析中,通常需要对异常值进行处理。以下是一些常用的处理方法:

2.1 用平均值或中位数替换异常值

可以使用numpy库中的mean()和median()函数计算数据的平均值和中位数,然后用它们替换异常值。例如:


import numpy as np
import pandas as pd
import copy

data = pd.DataFrame({'A': [1, 2, 3, np.inf, -np.inf]})
copy_data = copy.deepcopy(data)
copy_data['A'] = copy_data['A'].replace([np.inf, -np.inf], np.nan)
print(copy_data)
mean = copy_data['A'].mean(skipna=True)
median = copy_data['A'].median(skipna=True)
data['A'] = np.where((data['A'] > mean + 3 * median) | (data['A'] < mean - 3 * median), median, data['A'])
print(data)

输出结果为:


 A
0  1.0
1  2.0
2  3.0
3  NaN
4  NaN
     A
0  1.0
1  2.0
2  3.0
3  2.0
4  2.0

可以看到,异常值被用中位数替换了。这段代码首先创建了一个 DataFrame,然后使用深拷贝创建了一个拷贝 DataFrame。在拷贝 DataFrame 上,使用 .replace 方法将正无穷大和负无穷大替换为 NaN(缺失值)。接着,计算拷贝 DataFrame 的 'A' 列的均值和中位数,注意使用了 skipna=True 参数来忽略缺失值。

接下来,使用 np.where 来检查原始 DataFrame 中的 'A' 列是否超出了 3 倍中位数的范围,如果是,则用中位数替换。

这个代码块的功能是处理 'A' 列中的异常值,将超出阈值的值替换为中位数,并且在处理之前通过拷贝 DataFrame 将正无穷大和负无穷大替换为 NaN。

3.重复值处理

重复值是指数据集中某些数据项的值相同。在数据分析中,通常需要对重复值进行处理。以下是一些常用的处理方法:

可以使用pandas库中的drop_duplicates()函数删除重复值。例如:


import pandas as pd

data = pd.DataFrame({'A': [1, 2, 2, 3, 3, 3], 'B': [4, 5, 5, 6, 6, 6]})
data = data.drop_duplicates()
print(data)

输出结果为:


     A  B
0  1  4
1  2  5
3  3  6

    

可以看到,重复值被删除了。

用众数替换重复值

可以使用pandas库中的mode()函数计算数据的众数,然后用它替换重复值。例如:


import pandas as pd
import numpy as np
# 创建示例数据
data = pd.DataFrame({'A': [1, 2, 2, 3, 3, 3, 4, 4, 5, 6]})
print(data)
# 计算众数
mode_value = data['A'].mode()[0]
# 将重复值替换为众数
data['A'] = np.where(data.duplicated(subset=['A']), mode_value, data['A'])
print(data)

在这个示例中,我们首先创建一个包含重复值的 DataFrame 'data'。然后,使用 .mode() 方法计算 'A' 列的众数,并将其保存在变量 mode_value 中。接着,使用 np.where 来检查 'A' 列是否有重复值,如果有,就将其替换为众数。运行代码后,输出结果为:


 A
0  1
1  2
2  2
3  3
4  3
5  3
6  4
7  4
8  5
9  6
   A
0  1
1  2
2  3
3  3
4  3
5  3
6  4
7  3
8  5
9  6

可以看到,重复值被用众数替换了。其中data.duplicated(subset=['A']):这部分代码返回一个布尔数组,指示每行是否是重复行。subset=['A'] 表示我们只检查列 'A' 是否有重复值。

相关文章

Python启航:30天编程速成之旅(第17天)- 标准库(三)

喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。前期基础教程:「Python3.11.0」手把手教你安装最新版Python运行环境讲讲Python环境使用Pip命令快速下载各类库...

【Python时序数据系列】基于GRU模型时序数据二分类(案例+源码)

这是我的第371篇原创文章。一、引言前面我介绍了单变量时序预测和多变量时序预测,都是回归任务。相关链接:时序预测系列文章本文将介绍时序分类任务-基于GRU模型进行时序数据二分类。二、实现过程2.1 准...

第三课 python学习 集合

第三课 python学习 集合班级一有学生Bill,Mark,Mark班级二有学生Tom,Linda,Bill找出两个班级有同名的学生Bill知识点:求两个集合的交集。集合里存放的是基础数据类型,整型...

【Python机器学习系列】一文教你建立SVR模型预测房价(源码)

这是我的第270篇原创文章。一、引言对于表格数据,一套完整的机器学习建模流程如下:针对不同的数据集,有些步骤不适用,其中橘红色框为必要步骤,欢迎大家关注翻看我之前的一些相关文章。前面我介绍了机器学习模...

Python数据分析(五)Pandas数据预处理

合并数据在实际工作中,我们的数据源往往是来自多个地方(比如分散在不同的表里),具体分析的时候需要把相关联的数据信息整合在一张表里,可能会有如下操作:? 横向或纵向堆叠合并数据? 主键合并数据? 重叠合...

Python机器学习库Sklearn系列教程(14)-逻辑回归

参数penalty : str, ‘l1’ or ‘l2’LogisticRegression和LogisticRegressionCV默认就带了正则化项。penalty参数可选择的值为"l1...