Pandas 中文手册

10.4 重复值与异常值处理实战案例

Pandas重复值与异常值处理实战案例 | 数据清洗完全指南

Pandas 中文手册

本章节详细讲解Pandas中处理重复值和异常值的三个实战案例,包括批量删除重复行、用四分位法识别异常值并用中位数替换,以及修正数据中的逻辑错误。适合新手学习,提升数据清洗技能。

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

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

了解更多

Pandas重复值与异常值处理实战案例

欢迎来到Pandas数据清洗的学习章节!在处理数据时,重复值和异常值常常是影响分析结果的隐形杀手。本章将通过三个实战案例,手把手教你如何使用Pandas解决这些问题,让数据更干净、更可靠。无论你是数据分析新手还是想巩固技能,这里的内容都会让你受益匪浅。

引言

数据清洗是数据分析的第一步,也是最重要的一步。重复行会导致数据冗余,影响计算效率;异常值可能扭曲统计结果,误导决策;而逻辑错误则会让数据失去可信度。Pandas作为Python中强大的数据处理库,提供了丰富的函数来帮助我们高效处理这些挑战。接下来,让我们一起探索实战案例吧!

案例1:批量删除重复行,保留唯一数据

问题描述: 在数据集中,由于录入错误或合并操作,可能出现重复的行。我们需要快速删除这些重复项,只保留唯一的数据。

解决方案: 使用Pandas的drop_duplicates()方法,它可以基于指定列或所有列识别并删除重复行。

代码示例: 假设我们有一个简单的DataFrame df,包含姓名、年龄和分数信息。

import pandas as pd

# 创建示例数据
data = {'Name': ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob'],
        'Age': [25, 30, 25, 35, 30],
        'Score': [85, 90, 85, 88, 90]}
df = pd.DataFrame(data)

print("原始数据:")
print(df)

# 使用drop_duplicates()删除重复行,默认保留第一次出现的行
df_unique = df.drop_duplicates()
print("\n删除重复行后的数据:")
print(df_unique)

解释:

  • drop_duplicates() 方法默认基于所有列检查重复行,并保留第一次出现的行。
  • 你可以通过参数调整:
    • subset:指定要检查的列,例如 subset=['Name'] 只基于姓名列删除重复。
    • keep:控制保留哪些行,如 keep='last' 保留最后一次出现,或 keep=False 删除所有重复行。
  • 这确保了数据的唯一性,避免了重复计算。

案例2:用四分位法识别异常值,并用中位数替换

问题描述: 数据中的异常值(极端值)可能由测量误差或特殊事件引起,使用四分位法(IQR方法)可以科学识别它们,并用中位数替换以减少影响。

解决方案: 计算数据的四分位数和四分位距(IQR),定义异常值阈值,然后用中位数替换这些值。中位数对异常值不敏感,能保持数据集中趋势。

代码示例: 假设我们有一个数值列 Values,其中包含一些可能异常的值。

# 创建示例DataFrame
df = pd.DataFrame({'Values': [10, 12, 14, 100, 16, 18, 20, 120, 22, 24]})

print("原始数据:")
print(df['Values'])

# 计算四分位数:Q1(第一四分位数)、Q3(第三四分位数)和IQR(四分位距)
Q1 = df['Values'].quantile(0.25)  # 25%分位数
Q3 = df['Values'].quantile(0.75)  # 75%分位数
IQR = Q3 - Q1  # 四分位距

# 定义异常值阈值:低于 Q1 - 1.5*IQR 或高于 Q3 + 1.5*IQR 的值
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

print(f"\nQ1: {Q1}, Q3: {Q3}, IQR: {IQR}")
print(f"异常值阈值: 低于 {lower_bound} 或高于 {upper_bound}")

# 识别异常值
outliers = df[(df['Values'] < lower_bound) | (df['Values'] > upper_bound)]
print("\n异常值:")
print(outliers)

# 用中位数替换异常值
median_value = df['Values'].median()  # 计算中位数
df['Values_cleaned'] = df['Values'].apply(lambda x: median_value if (x < lower_bound or x > upper_bound) else x)

print("\n处理后数据(新增'Values_cleaned'列):")
print(df[['Values', 'Values_cleaned']])

解释:

  • quantile(0.25)quantile(0.75) 分别计算Q1和Q3。
  • IQR = Q3 - Q1,用于衡量数据的离散程度。
  • 异常值定义基于统计学标准,通常使用1.5倍IQR作为阈值。
  • median() 计算中位数,它比平均值更抗异常值影响。
  • 通过 apply() 函数和lambda表达式,我们可以条件替换异常值。

案例3:修正数据中的逻辑错误,保证数据有效性

问题描述: 数据中可能存在逻辑错误,如年龄为负数、性别编码不一致或日期格式错误。这些错误会影响数据分析的有效性,需要及时修正。

解决方案: 使用Pandas的 apply()replace() 等方法,基于业务逻辑检查和修正数据。

代码示例: 假设DataFrame包含姓名、年龄和性别列,其中年龄有负数,性别编码不一致。

# 创建示例数据
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
        'Age': [25, -5, 30, 40],  # Bob的年龄为负数,逻辑错误
        'Gender': ['F', 'M', 'Male', 'F']}  # 性别编码不一致
df = pd.DataFrame(data)

print("原始数据:")
print(df)

# 修正年龄:将负数替换为NaN(缺失值),表示数据无效
df['Age'] = df['Age'].apply(lambda x: x if x > 0 else pd.NA)  # 使用pd.NA表示缺失

# 修正性别:统一编码为'Female'和'Male'
df['Gender'] = df['Gender'].replace({'F': 'Female', 'M': 'Male', 'Male': 'Male', 'Female': 'Female'})

print("\n修正后的数据:")
print(df)

# 可选:填充缺失年龄为平均值或其他值
if df['Age'].isna().any():
    avg_age = df['Age'].mean(skipna=True)  # 跳过NaN计算平均值
    df['Age'] = df['Age'].fillna(avg_age)  # 填充缺失值
    print("\n填充缺失年龄后的数据:")
    print(df)

解释:

  • apply() 函数允许对每个值应用自定义函数,这里用lambda检查年龄是否为正数。
  • replace() 方法批量替换值,确保性别编码一致性。
  • 使用 pd.NA 表示缺失值,比 None 更符合Pandas处理缺失数据的标准。
  • 可选步骤:通过 fillna() 填充缺失值,如用平均值替换,但需根据业务场景决定。

总结

通过这三个实战案例,你已经学会了如何使用Pandas处理重复值、识别和替换异常值,以及修正逻辑错误。数据清洗是数据分析的基础,掌握这些技巧能让你在项目中更加得心应手。记得:

  • 定期检查数据质量,尤其是在导入新数据时。
  • 结合实际业务逻辑定义清洗规则。
  • 实践是最好的老师,尝试在真实数据集上应用这些方法。

鼓励你动手练习:加载自己的数据集,运行这些代码,观察数据变化,并思考如何优化。如果你有任何问题,欢迎继续学习后续章节或查阅Pandas官方文档。

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

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

获取工具包