Pandas 中文手册

8.3 重复值检查

Pandas重复值检查全攻略:从duplicated方法到subset参数

Pandas 中文手册

本章节详细讲解如何在Pandas中使用duplicated方法进行重复值检查,包括如何检查重复行、统计重复数量以及指定列重复值识别,帮助数据分析新手高效处理数据。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Pandas重复值检查:duplicated方法详解

引言

在数据分析中,数据往往存在重复值,如重复记录或冗余信息。重复值可能导致分析结果偏差、增加计算复杂度或浪费存储空间。因此,检查和清理重复值是数据清洗的重要步骤。Pandas库提供了强大而简便的duplicated方法,帮助你快速识别和处理重复数据。本教程面向新人,将逐步讲解如何使用duplicated方法进行重复值检查,让你轻松上手。

duplicated方法简介

duplicated方法是Pandas DataFrame对象的一个内置方法,用于检查数据中的重复行。它返回一个布尔序列(Boolean Series),其中True表示该行是重复行(即与之前出现的行相同),False表示该行是非重复行。默认情况下,duplicated会将所有列视为检查对象,并且只标记第一次出现之后的行作为重复行。

基本语法:

df.duplicated()  # 检查所有列的重复行

该方法还有一些重要参数,如subsetkeep,用于定制化检查,我们将在后续部分详细讲解。

检查重复行

使用duplicated()方法,你可以直接查看DataFrame中哪些行是重复的。下面是一个简单示例:

假设我们有一个包含学生信息的DataFrame:

import pandas as pd

# 创建示例DataFrame
data = {
    '姓名': ['张三', '李四', '张三', '王五', '李四'],
    '年龄': [20, 21, 20, 22, 21],
    '成绩': [85, 90, 85, 88, 90]
}
df = pd.DataFrame(data)
print(df)

输出:

   姓名  年龄  成绩
0  张三  20  85
1  李四  21  90
2  张三  20  85  # 与第0行重复
3  王五  22  88
4  李四  21  90  # 与第1行重复

现在使用duplicated()检查重复行:

duplicates = df.duplicated()
print(duplicates)

输出:

0    False
1    False
2     True  # 标记为重复行
3    False
4     True  # 标记为重复行
dtype: bool

从输出可以看出,第2行和第4行被标记为True,因为它们与之前的行完全重复(所有列值相同)。

统计重复行数量

要统计DataFrame中重复行的总数,可以使用duplicated().sum()sum()方法会将布尔序列中的True值(相当于1)相加,从而得到重复行数量。

接续上面的示例:

num_duplicates = df.duplicated().sum()
print(f"重复行数量: {num_duplicates}")

输出:

重复行数量: 2

这表示DataFrame中有2行是重复的。这个方法在数据清洗时非常有用,可以帮助你快速了解数据质量。

检查指定列的重复值

有时,你只关心某些列的重复值,而不是整行的重复。例如,在数据中,姓名可能重复,但其他信息不同。这时,可以使用subset参数来指定要检查的列名。

subset参数接受一个列名列表,duplicated方法将只考虑这些列的重复值。

示例:只检查“姓名”列的重复值。

name_duplicates = df.duplicated(subset=['姓名'])
print(name_duplicates)

输出:

0    False
1    False
2     True  # 姓名“张三”重复
3    False
4     True  # 姓名“李四”重复
dtype: bool

现在,重复检查只基于“姓名”列,所以第2行和第4行被标记为重复,因为姓名与之前的行相同,即使其他列可能不同。

你也可以指定多列,例如检查“姓名”和“年龄”列的重复值:

name_age_duplicates = df.duplicated(subset=['姓名', '年龄'])
print(name_age_duplicates)

输出:

0    False
1    False
2     True  # 姓名“张三”和年龄20重复
3    False
4     True  # 姓名“李四”和年龄21重复
dtype: bool

这样,duplicated方法变得更加灵活,可以根据业务需求定制重复检查的规则。

完整示例与注意事项

完整示例

下面是一个完整的代码示例,演示如何从创建DataFrame到进行重复值检查。

import pandas as pd

# 创建DataFrame
data = {
    'ID': [1, 2, 3, 1, 4],
    '姓名': ['Alice', 'Bob', 'Alice', 'Alice', 'Charlie'],
    '年龄': [25, 30, 25, 25, 35]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)

# 检查所有列的重复行
duplicate_rows = df.duplicated()
print("\n重复行检查(所有列):")
print(duplicate_rows)

# 统计重复行数量
total_duplicates = df.duplicated().sum()
print(f"\n总重复行数量: {total_duplicates}")

# 检查指定列(如“ID”和“姓名”)的重复值
specific_duplicates = df.duplicated(subset=['ID', '姓名'])
print("\n指定列(ID和姓名)重复检查:")
print(specific_duplicates)

输出:

原始数据:
   ID     姓名  年龄
0   1  Alice  25
1   2    Bob  30
2   3  Alice  25
3   1  Alice  25  # 与第0行重复(ID和姓名相同)
4   4  Charlie  35

重复行检查(所有列):
0    False
1    False
2    False
3     True
4    False
dtype: bool

总重复行数量: 1

指定列(ID和姓名)重复检查:
0    False
1    False
2    False
3     True
4    False
dtype: bool

注意事项

  1. keep参数duplicated方法有一个keep参数,用于控制如何处理重复行。默认keep='first',即首次出现的行标记为False,后续重复标记为True。你也可以设置为keep='last'来标记最后一次出现,或keep=False来将所有重复行(包括第一次)都标记为True。例如:

    df.duplicated(keep='last')
    

    这在某些场景下,如清理数据时保留最后一条记录,很有用。

  2. 数据类型:确保检查的列具有一致的数据类型,避免因类型不同导致的误判。例如,数值型和字符串型在比较时可能被视为不同。

  3. 性能:对于大型数据集,重复值检查可能耗时,可以使用Pandas的优化方法或分批处理。

  4. 结合其他方法:通常,在检查重复值后,你可以使用drop_duplicates()方法来删除重复行,进一步清理数据。

总结

通过本教程,你学习了如何使用Pandas的duplicated方法进行重复值检查。我们涵盖了以下内容:

  • 检查重复行:使用duplicated()返回布尔序列,快速识别重复行。
  • 统计重复行数量:通过duplicated().sum()计算重复行总数。
  • 检查指定列的重复值:利用subset参数灵活定制重复检查的列。

这些技巧能帮助你高效处理数据中的重复问题,提升数据清洗和分析的效率。实践是学习的关键,建议你尝试在自己的数据上应用这些方法。记住,合理检查重复值是确保数据质量的第一步!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包