数据去重详解

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

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

相关推荐
程序员柳6 小时前
基于Flask + Vue3 的新闻数据分析平台源代码+数据库+使用说明,爬取今日头条新闻数据,采集与清洗、数据分析、建立数据模型、数据可视化
数据库·数据分析·flask
武汉格发Gofartlic16 小时前
HFSS许可证常见问题及解决方案
大数据·运维·人工智能·数据分析·自动化
杨超越luckly17 小时前
HTML应用指南:利用GET请求获取全国OPPO官方授权体验店门店位置信息
前端·信息可视化·数据分析·html·argis·门店
Apache Flink18 小时前
Apache Flink:从实时数据分析到实时AI
大数据·人工智能·数据分析·flink·apache
SelectDB1 天前
天翼云与飞轮科技达成战略合作,共筑云数融合新生态
大数据·数据库·数据分析
Gyoku Mint1 天前
自然语言处理×第四卷:文本特征与数据——她开始准备:每一次输入,都是为了更像你地说话
人工智能·pytorch·神经网络·语言模型·自然语言处理·数据分析·nlp
WSSWWWSSW2 天前
Numpy科学计算与数据分析:Numpy数据分析基础之统计函数应用
开发语言·python·数据挖掘·数据分析·numpy
FIT2CLOUD飞致云2 天前
DataEase官方出品丨SQLBot:基于大模型和RAG的智能问数系统
数据分析·开源·数据可视化
凝新科技2 天前
Adobe Analytics 数据分析平台|全渠道客户行为分析与体验优化
大数据·adobe·数据分析