数据去重详解

在数据处理过程中,经常会遇到重复数据的问题。如果不进行去重,可能会导致分析结果偏差、计算资源浪费等问题。本文将详细介绍 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() 适合表格数据。
  • 大数据去重:生成器 + 集合或数据库优化。

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

相关推荐
SL_staff12 小时前
告别报表重复开发:JVS-BI 模板市场的参数化继承实践
java·数据分析·数据可视化
SelectDB13 小时前
时间旅行与快照能力速查:Doris 侧三条落地路径
大数据·数据库·数据分析
SelectDB13 小时前
云数仓成本结构拆解速查:五层计费 vs Doris / 托管形态
大数据·数据库·数据分析
SelectDB13 小时前
什么场景能承接与建议保留:Doris vs Snowflake 边界速查
大数据·数据库·数据分析
注塑机数据采集联网19 小时前
如何解决注塑机数据采集联网对接MES系统数据WiFi传输数据不稳问题
大数据·数据库·物联网·数据挖掘·数据分析
benchmark_cc20 小时前
实时行情和分钟 K 线应该如何配合使用?从信号计算到交易决策的完整分析
大数据·python·数据分析·pandas·量化交易·股票数据·quantdash
roman_日积跬步-终至千里21 小时前
【数据Agent论文·分析与报告评测|27】ComInsight:原子洞察正确,组合后的结论就可靠吗?
人工智能·算法·机器学习·数据分析
学术 学术 Fun1 天前
科研公开数据集怎么找?从关键词到许可证与数据引用
数据分析·科研·开放数据
roman_日积跬步-终至千里1 天前
【数据Agent论文·企业系统与可靠性|29】QwenPaw-Data:企业分析Agent为什么要分别管理事实、方法和执行?
人工智能·数据分析