数据去重详解

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

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

相关推荐
正在走向自律2 小时前
Python 数据分析与可视化:开启数据洞察之旅(5/10)
开发语言·人工智能·python·数据挖掘·数据分析
lilye663 小时前
精益数据分析(49/126):UGC商业模式中消息提醒与内容分享的关键作用
数据挖掘·数据分析
小L爱科研6 小时前
4.7/Q1,GBD数据库最新文章解读
数据库·机器学习·数据分析·回归·健康医疗
kngines7 小时前
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.4 模型部署与定期评估
postgresql·数据分析·存储过程·jsonb·pg_cron·ks值·影子测试机制
想看雪的瓜7 小时前
Nature图形复现—两种快速绘制热图的方法
信息可视化·数据挖掘·数据分析
镜舟科技7 小时前
湖仓一体架构在金融典型数据分析场景中的实践
starrocks·金融·架构·数据分析·湖仓一体·物化视图·lakehouse
生信大杂烩9 小时前
R语言绘图 | 渐变火山图
数据分析·r语言
Hello world.Joey10 小时前
数据挖掘入门-二手车交易价格预测
人工智能·python·数据挖掘·数据分析·conda·pandas
kngines10 小时前
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.3 风险指标可视化监控
postgresql·数据分析·区块链·逾期率·不良贷款率·客户信用评分
Narutolxy19 小时前
大模型数据分析破局之路20250512
人工智能·chatgpt·数据分析