本文目录导读:

我来详细介绍用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数据去重的常见场景和技巧,根据实际需求选择合适的去重策略,可以有效提高数据质量。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播