Python案例如何实现数据去重?

wen python案例 19

本文目录导读:

Python案例如何实现数据去重?

  1. 列表去重
  2. 字典去重(根据key)
  3. 使用pandas去重(处理结构化数据)
  4. 复杂对象去重
  5. 文件数据去重
  6. 自定义去重条件
  7. 性能对比
  8. 总结建议

在Python中实现数据去重有多种方法,下面我为你介绍几种常见且实用的案例:

列表去重

使用set(最简单)

# 基础列表去重
data = [1, 2, 2, 3, 4, 4, 5, 6, 6, 7]
unique_data = list(set(data))
print(f"去重前: {data}")
print(f"去重后: {unique_data}")
# 输出: 去重前: [1, 2, 2, 3, 4, 4, 5, 6, 6, 7]
# 输出: 去重后: [1, 2, 3, 4, 5, 6, 7]

保持顺序去重

# 保持原始顺序的去重
def remove_duplicates_keep_order(data):
    seen = set()
    result = []
    for item in data:
        if item not in seen:
            seen.add(item)
            result.append(item)
    return result
data = [3, 1, 2, 1, 3, 4, 2, 5]
unique_data = remove_duplicates_keep_order(data)
print(f"保持顺序去重: {unique_data}")
# 输出: [3, 1, 2, 4, 5]

字典去重(根据key)

# 根据字典中的某个字段去重
data = [
    {"id": 1, "name": "张三", "age": 25},
    {"id": 2, "name": "李四", "age": 30},
    {"id": 3, "name": "张三", "age": 28},  # 名字重复
    {"id": 4, "name": "王五", "age": 35},
    {"id": 5, "name": "张三", "age": 25},  # 完全重复
]
# 根据name字段去重,保留第一个出现的
unique_data = {}
for item in data:
    if item["name"] not in unique_data:
        unique_data[item["name"]] = item
result = list(unique_data.values())
print("根据name去重后的数据:")
for item in result:
    print(item)

使用pandas去重(处理结构化数据)

import pandas as pd
# 创建DataFrame
df = pd.DataFrame({
    'id': [1, 2, 3, 4, 5, 1, 2],
    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Alice', 'Bob'],
    'score': [85, 92, 78, 95, 88, 85, 92]
})
print("原始数据:")
print(df)
# 根据所有列去重
df_unique = df.drop_duplicates()
print("\n完全去重后:")
print(df_unique)
# 根据指定列去重
df_unique_name = df.drop_duplicates(subset=['name'])
print("\n根据name去重:")
print(df_unique_name)
# 保留最后一个重复项
df_unique_last = df.drop_duplicates(keep='last')
print("\n保留最后一个重复项:")
print(df_unique_last)

复杂对象去重

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __eq__(self, other):
        if isinstance(other, Person):
            return self.name == other.name and self.age == other.age
        return False
    def __hash__(self):
        return hash((self.name, self.age))
    def __repr__(self):
        return f"Person(name='{self.name}', age={self.age})"
# 创建Person对象列表
people = [
    Person("Alice", 25),
    Person("Bob", 30),
    Person("Alice", 25),  # 重复
    Person("Charlie", 35),
    Person("Bob", 30)     # 重复
]
# 使用set去重
unique_people = list(set(people))
print("去重后的人员列表:")
for person in unique_people:
    print(person)

文件数据去重

# 从文件中读取数据并去重
def deduplicate_file(input_file, output_file):
    seen_lines = set()
    with open(input_file, 'r', encoding='utf-8') as infile:
        with open(output_file, 'w', encoding='utf-8') as outfile:
            for line in infile:
                line_stripped = line.strip()
                if line_stripped not in seen_lines:
                    seen_lines.add(line_stripped)
                    outfile.write(line)
    print(f"去重完成!原始行数: X, 去重后行数: {len(seen_lines)}")
    return len(seen_lines)
# 使用示例
# deduplicate_file('input.txt', 'output.txt')

自定义去重条件

# 自定义去重规则
def custom_deduplicate(data, key_func):
    """
    key_func: 自定义的去重键函数
    """
    seen = set()
    result = []
    for item in data:
        key = key_func(item)
        if key not in seen:
            seen.add(key)
            result.append(item)
    return result
# 示例:根据字符串长度去重
words = ["apple", "banana", "cat", "dog", "elephant", "fox", "grape"]
unique_by_length = custom_deduplicate(words, lambda x: len(x))
print(f"根据长度去重: {unique_by_length}")
# 输出: ['apple', 'banana', 'elephant']  (每种长度只保留第一个)
# 示例:根据首字母去重
unique_by_first_letter = custom_deduplicate(words, lambda x: x[0])
print(f"根据首字母去重: {unique_by_first_letter}")
# 输出: ['apple', 'banana', 'cat', 'dog', 'elephant', 'fox', 'grape']

性能对比

import time
# 大数据量去重性能测试
large_data = list(range(1000000)) + list(range(500000, 1500000))
# 方法1: set去重
start = time.time()
result1 = list(set(large_data))
set_time = time.time() - start
print(f"Set去重耗时: {set_time:.4f}秒")
# 方法2: 循环去重
start = time.time()
seen = set()
result2 = []
for item in large_data:
    if item not in seen:
        seen.add(item)
        result2.append(item)
loop_time = time.time() - start
print(f"循环去重耗时: {loop_time:.4f}秒")
print(f"结果是否一致: {sorted(result1) == sorted(result2)}")

总结建议

  1. 简单列表去重:使用 list(set(data)) 最快捷
  2. 需要保持顺序:使用循环 + set 的方法
  3. 结构化数据:使用 pandas 的 drop_duplicates()
  4. 自定义对象:实现 __eq____hash__ 方法
  5. 大数据量:set 方法性能最好,但要注意内存占用

选择哪种方法主要取决于你的数据类型、是否需要保持顺序、以及数据量大小。

抱歉,评论功能暂时关闭!