本文目录导读:

我来详细介绍用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数据去重的常见场景和技巧,根据实际需求选择合适的去重策略,可以有效提高数据质量。