10.4 重复值与异常值处理实战案例
Pandas重复值与异常值处理实战案例 | 数据清洗完全指南
本章节详细讲解Pandas中处理重复值和异常值的三个实战案例,包括批量删除重复行、用四分位法识别异常值并用中位数替换,以及修正数据中的逻辑错误。适合新手学习,提升数据清洗技能。
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官方文档。