Python数据清洗之重复数据处理

大家好,在数据处理和分析的过程中,重复数据是一个常见的问题。重复的数据不仅会影响数据的准确性,还可能导致模型训练中的偏差。因此,检测并清理重复数据是数据清洗中的重要步骤。Python 的 Pandas 提供了强大的功能来检测、标记和删除重复数据,同时可以灵活设置规则以满足各种场景需求。本文将深入讲解 Pandas 中重复数据处理的常用方法,包括duplicated方法检测重复、drop_duplicates方法删除重复数据,并结合实际案例展示不同的清理策略。

重复数据可能由多种原因引起,例如数据录入错误、重复采集或合并数据集时的重复记录。处理重复数据主要是减少数据中的冗余信息,确保数据一致性,提高分析效率,避免重复数据导致的结果偏差,优化存储空间减少存储资源的浪费。无论是数据分析还是机器学习,处理重复数据都是保证数据可靠性的关键步骤。

1.数据准备

以一个包含重复数据的示例数据集为例,演示重复数据的检测和删除方法:

import pandas as pd

# 示例数据
data = {
    "Name": ["Alice", "Bob", "Alice", "David", "Bob", "Eve", "Alice"],
    "Age": [25, 30, 25, 35, 30, 40, 25],
    "City": ["NY", "LA", "NY", "SF", "LA", "NY", "NY"]
}

df = pd.DataFrame(data)
print("原始数据:\n", df)

输出如下所示:

     Name  Age City
0   Alice   25   NY
1     Bob   30   LA
2   Alice   25   NY
3   David   35   SF
4     Bob   30   LA
5     Eve   40   NY
6   Alice   25   NY

2.检测重复数据:duplicated方法

duplicated方法用于检测数据框中重复的行,它会标记出除了第一次出现外的重复行。

2.1 基本用法

# 检测重复行
df["Is_Duplicate"] = df.duplicated()
print("标记重复行后的数据:\n", df)

输出如下所示:

     Name  Age City  Is_Duplicate
0   Alice   25   NY         False
1     Bob   30   LA         False
2   Alice   25   NY          True
3   David   35   SF         False
4     Bob   30   LA          True
5     Eve   40   NY         False
6   Alice   25   NY          True

可以看到,duplicated方法标记了所有重复行中除了第一行外的重复记录。

2.2 根据特定列检测重复

如果只想根据某些列检测重复,可以指定subset参数。例如:

# 根据Name和City列检测重复
df["Is_Duplicate_Subset"] = df.duplicated(subset=["Name", "City"])
print("根据特定列标记重复行后的数据:\n", df)

输出如下所示:

     Name  Age City  Is_Duplicate  Is_Duplicate_Subset
0   Alice   25   NY         False                False
1     Bob   30   LA         False                False
2   Alice   25   NY          True                 True
3   David   35   SF         False                False
4     Bob   30   LA          True                 True
5     Eve   40   NY         False                False
6   Alice   25   NY          True                 True

3.删除重复数据:drop_duplicates方法

drop_duplicates方法用于删除重复行,并返回一个去重后的数据框。

3.1 基本用法

# 删除重复行
df_deduplicated = df.drop_duplicates()
print("删除重复行后的数据:\n", df_deduplicated)

输出如下所示:

     Name  Age City  Is_Duplicate  Is_Duplicate_Subset
0   Alice   25   NY         False                False
1     Bob   30   LA         False                False
3   David   35   SF         False                False
5     Eve   40   NY         False                False

默认情况下,drop_duplicates会保留重复行的第一个记录。

3.2 保留最后一条记录

可以通过设置keep参数为last来保留重复记录的最后一条:

# 保留最后一条记录
df_last = df.drop_duplicates(keep="last")
print("保留最后一条重复记录后的数据:\n", df_last)

输出如下所示:

     Name  Age City  Is_Duplicate  Is_Duplicate_Subset
2   Alice   25   NY          True                 True
4     Bob   30   LA          True                 True
3   David   35   SF         False                False
5     Eve   40   NY         False                False

3.3 根据特定列删除重复

duplicated方法类似,drop_duplicates也支持按特定列删除重复数据:

# 根据Name和City列删除重复
df_deduplicated_subset = df.drop_duplicates(subset=["Name", "City"])
print("根据特定列去重后的数据:\n", df_deduplicated_subset)

输出如下所示:

     Name  Age City  Is_Duplicate  Is_Duplicate_Subset
0   Alice   25   NY         False                False
1     Bob   30   LA         False                False
3   David   35   SF         False                False
5     Eve   40   NY         False                False

4.删除重复数据后重置索引

删除重复数据后,原始的索引可能不连续。可以通过reset_index方法重置索引:

# 重置索引
df_cleaned = df_deduplicated.reset_index(drop=True)
print("重置索引后的数据:\n", df_cleaned)

输出如下所示:

     Name  Age City
0   Alice   25   NY
1     Bob   30   LA
2   David   35   SF
3     Eve   40   NY

5.实际案例:清洗用户数据

以下是一个结合duplicateddrop_duplicates的实际案例,展示如何处理重复的用户注册数据。

5.1 示例数据

user_data = {
    "UserID": [101, 102, 103, 101, 104, 102],
    "Name": ["Alice", "Bob", "Charlie", "Alice", "David", "Bob"],
    "SignupDate": ["2023-01-01", "2023-01-02", "2023-01-03", "2023-01-04", "2023-01-05", "2023-01-06"]
}

user_df = pd.DataFrame(user_data)
print("用户注册数据:\n", user_df)

5.2 按UserID检测并保留最后一次注册

# 保留每个UserID的最新注册记录
user_df_cleaned = user_df.drop_duplicates(subset=["UserID"], keep="last")
print("清洗后的用户注册数据:\n", user_df_cleaned)

输出如下所示:

   UserID     Name  SignupDate
1     102      Bob  2023-01-06
2     103  Charlie  2023-01-03
3     101    Alice  2023-01-04
4     104    David  2023-01-05

5.3 按UserID和Name检测重复

如果用户可能因拼写错误多次注册,可以同时基于UserIDName检测重复:

# 标记重复记录
user_df["Is_Duplicate"] = user_df.duplicated(subset=["UserID", "Name"])
print("标记重复后的用户注册数据:\n", user_df)

输出如下所示:

   UserID     Name  SignupDate  Is_Duplicate
0     101    Alice  2023-01-01         False
1     102      Bob  2023-01-02         False
2     103  Charlie  2023-01-03         False
3     101    Alice  2023-01-04          True
4     104    David  2023-01-05         False
5     102      Bob  2023-01-06          True

在数据分析和清洗中,重复数据处理是确保数据质量的重要步骤。Python Pandas 提供了强大的工具来高效检测和删除重复数据,其中duplicated方法可标记重复行,而drop_duplicates方法用于清理重复记录并保留指定的记录。通过灵活设置参数,用户可以基于特定列检测重复数据,选择保留第一条或最后一条记录,甚至结合自定义逻辑进行深度清洗。在实际应用中,如用户注册数据清理,可以根据业务需求合理使用这些方法,快速消除冗余数据,确保分析结果的准确性和可靠性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python慕遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值