本节前言

重复值会导致统计结果偏差。pandas 提供 duplicated() 检测与 drop_duplicates() 删除的完整方案。

1. 检测重复值:duplicated()

返回布尔 Series,标记重复行(除首次出现外)。

参数

参数类型默认值说明
subsetlistNone指定列的子集判断重复
keepstr / bool’first''first’:标记后续重复;‘last’:标记之前重复;False:全部标记

示例

df = pd.DataFrame({
    'A': [1, 1, 2, 2, 3],
    'B': ['x', 'x', 'y', 'z', 'z']
})
 
df.duplicated()
# 0    False
# 1     True   # A=1, B=x 与行 0 重复
# 2    False
# 3    False
# 4    False
 
# 只看 A 列
df.duplicated(subset=['A'])
# 0    False
# 1     True
# 2    False
# 3     True
# 4    False
 
# 标记所有重复(包括首次)
df.duplicated(keep=False)
# 0    False
# 1    False
# 2     True
# 3     True
# 4    False   # A=3 只出现一次,不标记

2. 删除重复值:drop_duplicates()

删除重复行,返回去重后的 DataFrame。

参数

参数类型默认值说明
subsetlistNone指定列判断重复
keepstr / bool’first’保留哪个重复项
inplaceboolFalse是否原地修改
ignore_indexboolFalse是否重置索引为 0..n-1

示例

df.drop_duplicates()
#    A  B
# 0  1  x
# 2  2  y
# 3  2  z
# 4  3  z
 
df.drop_duplicates(subset=['A'])
 
df.drop_duplicates(keep='last')
 
df.drop_duplicates(keep=False)   # 删除所有出现超过一次的行
 
df.drop_duplicates(ignore_index=True)   # 重置索引

实用技巧

  • 先 duplicated() 定位,再 drop_duplicates() 清理。
  • 使用 subset 防止因无关列差异而误判。
  • keep=False 可用于剔除任何非唯一的行。
  • 若需统计重复数量:df.duplicated().sum()。

🔗 相关笔记