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' 是否有重复值。