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