Python案例如何用Pandas做数据去重

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据去重

  1. 准备示例数据
  2. 基础去重方法
  3. 高级去重技巧
  4. 实际应用案例
  5. 实用函数封装
  6. 注意事项

我来详细介绍用Pandas进行数据去重的常用方法。

准备示例数据

import pandas as pd
# 创建示例数据
data = {
    '姓名': ['张三', '李四', '王五', '张三', '李四', '赵六', '张三'],
    '年龄': [25, 30, 35, 25, 30, 28, 25],
    '城市': ['北京', '上海', '广州', '北京', '上海', '深圳', '北京'],
    '工资': [8000, 9000, 10000, 8000, 9000, 8500, 8000]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)
print(f"\n数据条数:{len(df)}")

基础去重方法

1 完全重复行去重

# 删除所有列都完全相同的重复行
df_unique = df.drop_duplicates()
print("完全去重后:")
print(df_unique)
print(f"剩余条数:{len(df_unique)}")

2 基于指定列去重

# 基于'姓名'列去重,保留第一个出现的记录
df_name_unique = df.drop_duplicates(subset=['姓名'])
print("基于姓名去重(保留第一个):")
print(df_name_unique)
# 基于'姓名'列去重,保留最后一个出现的记录
df_name_unique_last = df.drop_duplicates(subset=['姓名'], keep='last')
print("\n基于姓名去重(保留最后一个):")
print(df_name_unique_last)
# 基于多列去重
df_multi = df.drop_duplicates(subset=['姓名', '城市'])
print("\n基于姓名和城市去重:")
print(df_multi)

高级去重技巧

1 查看重复行

# 查看哪些行是重复的
duplicates = df.duplicated()
print("重复标记:")
print(duplicates)
# 查看重复行(所有列)
duplicate_rows = df[df.duplicated()]
print("\n重复的行:")
print(duplicate_rows)
# 查看基于指定列的重复
duplicate_name = df[df.duplicated(subset=['姓名'], keep=False)]
print("\n姓名重复的行:")
print(duplicate_name)

2 去重并统计

# 统计每种值的出现次数
name_counts = df['姓名'].value_counts()
print("姓名出现次数:")
print(name_counts)
# 统计重复数量
print(f"\n总记录数:{len(df)}")
print(f"唯一姓名数:{df['姓名'].nunique()}")
print(f"重复记录数:{len(df) - len(df.drop_duplicates())}")

实际应用案例

1 数据清洗案例

# 模拟真实场景:多源数据合并后的去重
data1 = {
    '用户ID': [1, 2, 3, 4],
    '姓名': ['张三', '李四', '王五', '赵六'],
    '邮箱': ['zhang@qq.com', 'li@163.com', 'wang@qq.com', 'zhao@qq.com']
}
data2 = {
    '用户ID': [3, 4, 5, 6],
    '姓名': ['王五', '赵六', '孙七', '周八'],
    '邮箱': ['wang@qq.com', 'zhao@qq.com', 'sun@qq.com', 'zhou@qq.com']
}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
# 合并数据
df_merged = pd.concat([df1, df2], ignore_index=True)
print("合并后的数据:")
print(df_merged)
# 按用户ID去重,保留第一次出现的数据
df_clean = df_merged.drop_duplicates(subset=['用户ID'], keep='first')
print("\n去重后的数据:")
print(df_clean)

2 复杂去重场景

# 模拟更复杂的数据去重场景
import numpy as np
data_complex = {
    '订单ID': [1001, 1002, 1002, 1003, 1004, 1004],
    '产品': ['A', 'B', 'B', 'C', 'D', 'D'],
    '数量': [2, 3, 3, 1, 5, 5],
    '金额': [200, 300, 300, 100, 500, 500],
    '日期': ['2024-01-01', '2024-01-02', '2024-01-02', 
             '2024-01-03', '2024-01-04', '2024-01-05']
}
df_complex = pd.DataFrame(data_complex)
# 方法1:完全匹配去重
df_clean1 = df_complex.drop_duplicates()
print("方法1 - 完全匹配去重:")
print(df_clean1)
# 方法2:基于关键字段去重(订单ID和产品)
df_clean2 = df_complex.drop_duplicates(subset=['订单ID', '产品'], keep='last')
print("\n方法2 - 基于订单和产品去重:")
print(df_clean2)
# 方法3:基于条件去重(保留最近日期的记录)
df_clean3 = df_complex.sort_values('日期').drop_duplicates(
    subset=['订单ID', '产品'], 
    keep='last'
)
print("\n方法3 - 保留最新记录:")
print(df_clean3)

实用函数封装

def smart_deduplicate(df, key_columns, strategy='first'):
    """
    智能数据去重函数
    参数:
    df: DataFrame
    key_columns: 用于判断重复的列名列表
    strategy: 去重策略 ('first', 'last', 'max_quantity', 'max_amount')
    """
    if strategy == 'first':
        return df.drop_duplicates(subset=key_columns, keep='first')
    elif strategy == 'last':
        return df.drop_duplicates(subset=key_columns, keep='last')
    elif strategy == 'max_quantity':
        return (df.sort_values('数量', ascending=False)
                .drop_duplicates(subset=key_columns, keep='first'))
    elif strategy == 'max_amount':
        return (df.sort_values('金额', ascending=False)
                .drop_duplicates(subset=key_columns, keep='first'))
    else:
        raise ValueError("不支持的策略")
# 使用示例
result = smart_deduplicate(df_complex, key_columns=['订单ID', '产品'], strategy='first')
print("智能去重结果:")
print(result)

注意事项

1 数据类型影响

# 注意数据类型对去重的影响
df_type = pd.DataFrame({
    'A': [1, 1.0, '1'],
    'B': [2, 2, 2]
})
print("不同类型值的比较:")
print(df_type)
print(f"值1是否为浮点数1.0:{1 == 1.0}")  # True
print(f"值1是否等于字符串'1':{1 == '1'}")  # False

2 缺失值处理

# 处理缺失值的情况
df_na = pd.DataFrame({
    'name': ['张三', '张三', None, '李四'],
    'age': [25, 25, 30, None]
})
# 默认情况下,NaN被视为相同值
df_na_unique = df_na.drop_duplicates()
print("含缺失值的去重:")
print(df_na_unique)

这些示例涵盖了Pandas数据去重的常见场景和技巧,根据实际需求选择合适的去重策略,可以有效提高数据质量。

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