删除数据中的重复项是指从数据集(如数据库表、数组、CSV文件等)中移除内容完全相同的行或记录,只保留其中一条。这是数据清洗和预处理中的常见操作。
-- 方法1: 使用DISTINCT关键字
SELECT DISTINCT * FROM table_name;
-- 方法2: 使用GROUP BY
SELECT column1, column2, ...
FROM table_name
GROUP BY column1, column2, ...;
-- 方法3: 使用ROW_NUMBER()窗口函数(保留最新记录)
WITH CTE AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY column1, column2, ... ORDER BY id DESC) AS rn
FROM table_name
)
DELETE FROM CTE WHERE rn > 1;
# 使用pandas处理DataFrame
import pandas as pd
# 读取数据
df = pd.read_csv('data.csv')
# 删除完全重复的行
df.drop_duplicates(inplace=True)
# 基于特定列删除重复行
df.drop_duplicates(subset=['column1', 'column2'], keep='first', inplace=True)
# 使用集合处理列表
original_list = [1, 2, 2, 3, 4, 4, 5]
unique_list = list(set(original_list)) # 顺序会改变
# 保持顺序的方法
from collections import OrderedDict
unique_list = list(OrderedDict.fromkeys(original_list))
// 数组去重
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [...new Set(array)];
// 对象数组去重
const objectArray = [{id: 1}, {id: 2}, {id: 1}];
const uniqueObjectArray = objectArray.filter(
(obj, index, self) => index === self.findIndex((o) => o.id === obj.id)
);
import java.util.*;
public class RemoveDuplicates {
public static void main(String[] args) {
// List去重
List<Integer> list = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
List<Integer> uniqueList = new ArrayList<>(new LinkedHashSet<>(list));
// 对象列表去重
List<Person> persons = Arrays.asList(
new Person(1, "John"),
new Person(2, "Jane"),
new Person(1, "John")
);
List<Person> uniquePersons = persons.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Person::getId))),
ArrayList::new
));
}
}
class Person {
private int id;
private String name;
// 构造方法、getter和setter省略
}
原因:某些去重方法(如使用Set)不保留原始顺序
解决方案:
OrderedDict.fromkeys()
filter
和findIndex
组合LinkedHashSet
代替HashSet
原因:对象比较是基于引用而非内容
解决方案:
原因:算法复杂度高或内存不足
解决方案:
原因:只基于部分列去重可能导致其他列数据不同
解决方案: