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

在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 4种方法对不同数量级数据归一化

在机器学习和数据处理过程中,对不同数量级的数据进行归一化是一项重要的预处理步骤。归一化可以将数据缩放到同一范围,避免某些特征因数值较大而主导模型训练。Python 提供了多种方法对数据进行归一化,以下...

怎样用Python进行数据转换和归一化

怎样用Python进行数据转换和归一化 1、概述 实际的数据库极易受到噪声、缺失值和不一致数据的侵扰,因为数据库太大,并且多半来自多个异种数据源,低质量的数据将会导致低质量的数据分析结果,大量的数据...

提升数据质量的秘密武器:最小-最大归一化全揭秘

最小-最大归一化(Min-Max Normalization)是一种常见的数据预处理技术,用于将特征数据缩放到一个固定的范围(通常是[0, 1])。这种归一化方法通过将数据按比例缩放,使得数据集的最小...

python对音频的处理

首先,我们需要 import 几个工具包,一个是 python 标准库中的 wave 模块,用于音频处理操作,另外两个是 numpy 和 matplot,提供数据处理函数一:读取本地音频数据处理音频第...

再见了,Python~

这几天,很多同学问到,关于Python数据分析方面的操作。用起来头疼,需要不断的查询。所以,今天给大家总结了100个最最核心的操作。如果再遇到问题,这里直接查看,超级方便,基本日常使用的都有了~需要本...

在Python中将函数作为参数传入另一个函数中

在我们的Python学习中,我们学到的众多令人瞠目结舌的事实之一是,你可以将函数传入其他函数。你可以来回传递函数,因为在Python中,函数是对象。在使用Python的第一周,你可能不需要了解这些,但...