数据去重详解

在数据处理过程中,经常会遇到重复数据的问题。如果不进行去重,可能会导致分析结果偏差、计算资源浪费等问题。本文将详细介绍 Python 中常用的数据去重方法 ,涵盖 列表、NumPy数组、Pandas DataFrame 等多种数据结构,并提供代码示例,帮助初学者快速掌握数据去重的技巧。


1. 什么是数据去重?

数据去重(Deduplication)是指 从数据集中删除重复的记录,只保留唯一的数据项。常见的应用场景包括:

  • 清洗爬虫抓取的重复数据
  • 去除数据库中的冗余记录
  • 统计唯一用户数(UV)
  • 数据聚合分析前的预处理

2. Python 数据去重方法

2.1 列表(List)去重

列表是 Python 中最基础的数据结构,去重方法主要有以下几种:

方法 1:使用 set()(集合自动去重)
python 复制代码
data = [1, 2, 2, 3, 4, 4, 5]
unique_data = list(set(data))
print(unique_data)  # 输出:[1, 2, 3, 4, 5](顺序可能变化)

特点

  • 最简单,但 不保持原顺序(集合是无序的)。
  • 适用于不关心顺序的场景。
方法 2:使用 dict.fromkeys()(保持顺序)
python 复制代码
data = [1, 2, 2, 3, 4, 4, 5]
unique_data = list(dict.fromkeys(data))
print(unique_data)  # 输出:[1, 2, 3, 4, 5](保持原顺序)

特点

  • 利用字典键的唯一性,保持原顺序
  • Python 3.7+ 版本字典默认有序。
方法 3:遍历判断(适用于复杂数据)
python 复制代码
data = [1, 2, 2, 3, 4, 4, 5]
unique_data = []
for item in data:
    if item not in unique_data:
        unique_data.append(item)
print(unique_data)  # 输出:[1, 2, 3, 4, 5](保持顺序)

特点

  • 适用于 自定义去重逻辑(如基于对象属性去重)。
  • 但时间复杂度较高(O(n²)),大数据量时较慢。

2.2 NumPy 数组去重

NumPy 提供了 np.unique() 方法,适用于数值型数据去重。

方法 4:np.unique()
python 复制代码
import numpy as np

arr = np.array([1, 2, 2, 3, 4, 4, 5])
unique_arr = np.unique(arr)
print(unique_arr)  # 输出:[1 2 3 4 5]

进阶用法

  • return_index=True:返回唯一值在原数组的首次出现位置。
  • return_counts=True:返回每个唯一值的出现次数。
python 复制代码
unique_values, indices, counts = np.unique(arr, return_index=True, return_counts=True)
print(unique_values)  # 唯一值:[1 2 3 4 5]
print(indices)        # 首次出现位置:[0 1 3 4 6]
print(counts)         # 出现次数:[1 2 1 2 1]

2.3 Pandas DataFrame 去重

Pandas 是数据分析的利器,提供了 drop_duplicates() 方法,适用于表格数据去重。

方法 5:df.drop_duplicates()
python 复制代码
import pandas as pd

data = {
    "Name": ["Alice", "Bob", "Alice", "Charlie", "Bob"],
    "Age": [25, 30, 25, 35, 30]
}
df = pd.DataFrame(data)

# 默认去重(所有列完全相同才去重)
df_unique = df.drop_duplicates()
print(df_unique)

输出

复制代码
      Name  Age
0    Alice   25
1      Bob   30
3  Charlie   35

进阶用法

  • subset=["列名"]:指定某些列去重。
  • keep="first" | "last" | False:保留第一个/最后一个/全部删除重复项。
  • ignore_index=True:重置索引。
python 复制代码
# 只对 "Name" 列去重,保留第一个出现的记录
df_unique_name = df.drop_duplicates(subset=["Name"], keep="first")
print(df_unique_name)

输出

复制代码
      Name  Age
0    Alice   25
1      Bob   30
3  Charlie   35

2.4 大数据去重优化

如果数据量非常大(如百万级),可以使用更高效的方法:

方法 6:生成器 + 集合(节省内存)
python 复制代码
def dedupe_large_data(data_iter):
    seen = set()
    for item in data_iter:
        if item not in seen:
            yield item
            seen.add(item)

# 示例:逐行读取大文件去重
with open("large_data.txt", "r") as f:
    unique_lines = list(dedupe_large_data(f))
方法 7:使用数据库(如 SQL DISTINCT
sql 复制代码
-- 示例:SQL 去重
SELECT DISTINCT column1, column2 FROM table_name;

3. 如何选择去重方法?

场景 推荐方法
简单列表去重(不关心顺序) list(set(data))
列表去重(保持顺序) list(dict.fromkeys(data))
NumPy 数组去重 np.unique()
Pandas DataFrame 去重 df.drop_duplicates()
大数据去重(内存优化) 生成器 + 集合
数据库去重 SQL DISTINCT

4. 总结

  • 列表去重set() 最快但不保序,dict.fromkeys() 保序。
  • NumPy 去重np.unique() 适合数值计算。
  • Pandas 去重drop_duplicates() 适合表格数据。
  • 大数据去重:生成器 + 集合或数据库优化。

欢迎在评论区交流你的去重技巧! 😊

相关推荐
语落心生14 分钟前
大宗供应链企业舆情指标系统设计(一)舆情指标设计
数据分析
语落心生1 小时前
餐饮供应链的数仓设计思考 (五) 系统稳定性与SLA保障体系
数据分析
语落心生1 小时前
餐饮供应链的数仓设计思考 (四) 餐饮连锁企业数据模型可解释性
数据分析
语落心生1 小时前
餐饮供应链的数仓设计思考 (三) 数据管道与核心系统API对接方案
数据分析
语落心生1 小时前
餐饮供应链的数仓设计思考 (二) 餐饮连锁企业深度业务模型分析
数据分析
语落心生1 小时前
餐饮供应链的数仓设计思考 (一) 系统设计大纲
数据分析
用户41429296072393 小时前
批量商品信息采集工具获取商品详情的完整方案
爬虫·数据挖掘·数据分析
用户41429296072393 小时前
淘宝实时商品API接口:采集竞品商品详情页的价格、SKU 规格、库存数量、卖点文案、图文内容、售后政策(运费、退换货规则)、评价核心标签
数据挖掘·数据分析·数据可视化
江上月51320 小时前
Pandas 高级教程:解锁数据分析的强大潜能
数据挖掘·数据分析·pandas
点金石游戏出海1 天前
玩家为何退出、不付费?读懂这些关键的“行为数据”,解锁增长密码!
游戏·数据分析·用户分析·游戏运营