Pandas 中文手册

10.2 异常值处理(核心:识别→处理,不破坏数据分布)

Pandas异常值处理指南:识别、处理与技巧

Pandas 中文手册

本章详细介绍Pandas中异常值处理的完整指南,涵盖异常值识别方法、删除法、替换法、修正法、缩尾处理(winsorize)以及数值型和字符串型异常值的处理技巧,适合数据分析初学者。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

异常值处理

什么是异常值?

异常值(Outliers)是数据集中与其他观测值显著不同的值,可能由测量错误、数据录入问题或真实极端情况引起。在数据分析中,处理异常值至关重要,因为它们会影响统计结果和模型性能。处理异常值的核心是识别后处理,同时尽量不破坏数据分布。

异常值识别方法

首先,需要识别异常值,常用方法包括:

  • 箱线图(Boxplot):可视化识别异常值,超出箱体上下须的值被视为异常。
  • IQR(四分位距)法:计算数据的四分位距,定义异常值为低于Q1-1.5IQR或高于Q3+1.5IQR的值。
  • Z-score法:基于标准偏差,Z-score绝对值大于3的值通常被认为是异常值。

代码示例:使用Pandas识别异常值

使用IQR方法识别数值型数据中的异常值:

import pandas as pd
import numpy as np

# 创建示例DataFrame
df = pd.DataFrame({
    'value': [1, 2, 3, 4, 5, 100],  # 100为极端值
    'category': ['A', 'B', 'A', 'B', 'A', 'C']
})

# 计算IQR以识别异常值
Q1 = df['value'].quantile(0.25)  # 第一四分位数
Q3 = df['value'].quantile(0.75)  # 第三四分位数
IQR = Q3 - Q1  # 四分位距
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 识别异常值
outliers = df[(df['value'] < lower_bound) | (df['value'] > upper_bound)]
print('识别到的异常值:')
print(outliers)

异常值处理方法

1. 异常值删除法

谨慎使用,适用于极端异常值,避免删除可能含有有用信息的值。

# 删除异常值,保留正常范围的数据
df_clean = df[(df['value'] >= lower_bound) & (df['value'] <= upper_bound)]
print('删除异常值后的DataFrame:')
print(df_clean)

2. 异常值替换法

用均值、中位数或分位数替换异常值,以减少对数据分布的影响。

# 用中位数替换异常值
median_val = df['value'].median()
df_replaced = df.copy()  # 创建副本以避免修改原数据
df_replaced['value'] = df_replaced['value'].mask(
    (df_replaced['value'] < lower_bound) | (df_replaced['value'] > upper_bound),
    median_val
)
print('替换后的DataFrame:')
print(df_replaced)

3. 异常值修正法

根据业务逻辑修正异常值,例如修正日期格式错误或数据录入错误。

# 示例:修正日期列中的错误值,假设有日期列
df_date = pd.DataFrame({
    'date': ['2023-01-01', '错误日期', '2023-02-01', '2023-03-01']
})

# 使用errors='coerce'转换无效日期为NaT
df_date['date_corrected'] = pd.to_datetime(df_date['date'], errors='coerce')
print('修正后的日期列:')
print(df_date)

# 根据需要填充或处理NaT

4. 异常值缩尾处理(Winsorization)

将异常值限制在指定范围内,例如通过设置百分位数截断,保持数据分布。

from scipy.stats.mstats import winsorize  # 需要scipy库

# 假设数据已识别异常值,进行缩尾处理,限制在5%的极值范围内
df['value_winsorized'] = winsorize(df['value'], limits=[0.05, 0.05])
print('缩尾处理后的数据:')
print(df[['value', 'value_winsorized']])

不同类型异常值的处理技巧

数值型异常值

  • 识别:使用统计方法如IQR、Z-score。
  • 处理:结合数据场景选择删除、替换或缩尾。

字符串型异常值

常见于数据录入错误或格式不一致,处理方法包括:

  • 字符串清洗:使用str.replace()修正错误值。
  • 分类值处理:对类别数据,可以使用映射或标准化。
# 示例:处理字符串型异常值,如修正错误类别
df_str = pd.DataFrame({
    'category': ['A', 'B', '错误值', 'A', 'C']
})

# 替换错误字符串
df_str['category'] = df_str['category'].str.replace('错误值', 'Unknown')
print('处理后的字符串列:')
print(df_str)

总结与最佳实践

  • 识别优先:首先识别异常值,使用多种方法交叉验证。
  • 谨慎处理:根据数据分布和业务需求选择处理方法,避免盲目删除。
  • 保持分布:处理异常值时,尽量维持数据原始分布,特别是在使用替换法时。
  • 文档记录:记录异常值处理步骤,便于后续分析和重现。

在Pandas中,结合使用数据分析库如NumPy和SciPy,可以高效处理异常值。实践时,建议从小数据集开始测试,逐步应用到大规模数据中。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包