Bootstrap

Pandas使用教程 - 数据重复值与唯一值处理 (duplicated, drop_duplicates, unique)

进阶篇32. 数据重复值与唯一值处理 (duplicated, drop_duplicates, unique)

在数据清洗过程中,重复值和唯一值的处理是十分关键的一步。重复值可能会扭曲统计分析、建模结果或可视化展示,而唯一值则常用于了解数据的分布和特征。Pandas 提供了几种高效的方法来检测和处理重复值,包括 duplicated()drop_duplicates()unique()

本文将详细介绍这三种方法的基本原理、用法、参数设置和实际案例,帮助你在数据预处理过程中有效管理重复数据与唯一数据。


1. duplicated() 方法

1.1 基本概念

duplicated() 方法用于标记 DataFrame 或 Series 中的重复行。对于每一行,它返回一个布尔值:如果该行在之前已经出现过,则返回 True,否则返回 False。数学上,设数据集为 ( D = {d_1, d_2, \dots, d_n} ),则
duplicated ( d i ) = { T r u e , if  d i  is a duplicate of any  d j ,    j < i F a l s e , otherwise \text{duplicated}(d_i) = \begin{cases} True, & \text{if } d_i \text{ is a duplicate of any } d_j, \; j < i \\ False, & \text{otherwise} \end{cases} duplicated(di)={True,False,if di is a duplicate of any dj,j<iotherwise

1.2 示例代码

import pandas as pd

# 创建示例 DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'Bob', 'Alice', 'David'],
    'Age': [25, 30, 35, 30, 25, 40],
    'Score': [85, 90, 95, 90, 85, 80]
}
df = pd.DataFrame(data)

# 检查重复行
duplicates = df.duplicated()
print("默认重复判断(保留首个出现的):")
print(duplicates)

# 检查所有重复,包括首个重复项
duplicates_all = df.duplicated(keep=False)
print("\n所有重复项(keep=False):")
print(duplicates_all)

输出示例:

默认重复判断(保留首个出现的):
0    False
1    False
2    False
3     True
4     True
5    False
dtype: bool

所有重复项(keep=False):
0     True
1     True
2    False
3     True
4     True
5    False
dtype: bool

通过设置 keep 参数,你可以控制重复值的标记方式:

  • keep='first'(默认):保留第一项,后续重复标记为 True。
  • keep='last':保留最后一项,其他标记为 True。
  • keep=False:所有重复项均标记为 True。

2. drop_duplicates() 方法

2.1 基本概念

drop_duplicates() 方法用于删除 DataFrame 中的重复行,返回一个新的 DataFrame,其中每组重复数据只保留一条记录。该方法可以基于所有列或指定列进行重复值检查。数学上,如果数据集 ( D ) 包含重复元素,则删除重复操作将保留一个唯一集合:
D unique = { d ∣ d ∈ D } D_{\text{unique}} = \{ d \mid d \in D \} Dunique={ddD}

2.2 示例代码

# 删除重复行,默认保留首个出现的记录
df_unique = df.drop_duplicates()
print("删除重复行后的 DataFrame:")
print(df_unique)

# 针对指定列删除重复值,例如只检查 'Name' 列
df_unique_name = df.drop_duplicates(subset=['Name'])
print("\n仅基于 'Name' 列删除重复值后的 DataFrame:")
print(df_unique_name)

# 保留重复行中最后一条记录
df_unique_last = df.drop_duplicates(keep='last')
print("\n保留重复行中最后一条记录:")
print(df_unique_last)

通过 subset 参数,你可以只针对部分列进行重复值检测。keep 参数则控制保留策略。


3. unique() 方法

3.1 基本概念

unique() 方法用于返回 Series 中所有唯一值的数组。它常用于探索性数据分析,帮助了解一列中有多少不同的值以及它们的分布情况。数学上,对于集合 ( S = {s_1, s_2, \dots, s_n} ),unique 操作生成集合:
U = { s ∣ s ∈ S } 且  U  中的元素均唯一 U = \{ s \mid s \in S \} \quad \text{且 } U \text{ 中的元素均唯一} U={ssS} U 中的元素均唯一

3.2 示例代码

# 获取 'Name' 列中所有唯一值
unique_names = df['Name'].unique()
print("Name 列的唯一值:")
print(unique_names)

# 对于多维数据,可以结合 drop_duplicates() 查看 DataFrame 中各行的唯一组合
unique_rows = df.drop_duplicates()
print("\nDataFrame 中唯一的行:")
print(unique_rows)

4. 应用场景

4.1 数据清洗

在数据清洗过程中,重复值可能会导致统计结果偏差。使用 duplicated() 和 drop_duplicates() 可以帮助去除冗余数据。

4.2 数据探索

利用 unique() 方法快速查看分类变量的分布,了解数据中包含哪些不同的类别。

4.3 模型构建

在构建模型时,冗余数据可能影响模型性能和泛化能力,因此删除重复值可以提高模型的准确性和训练效率。


5. 最佳实践与注意事项

  • 检查所有重复项
    在删除重复值之前,建议先使用 duplicated(keep=False) 检查哪些记录重复,以确保删除操作不会误删重要数据。

  • 指定列进行检查
    针对大型数据集或特定分析任务,可以只检查关键列,从而提高操作效率并避免不必要的数据丢失。

  • 保留策略的选择
    根据具体需求选择保留首个或最后一个重复项,或完全删除所有重复数据。不同场景下,这一策略可能会对后续分析产生影响。

  • 性能考虑
    对于非常大的 DataFrame,drop_duplicates() 和 unique() 都是高效的向量化操作,但在极端情况下仍需注意内存消耗和执行时间。


6. 总结

本文详细介绍了 Pandas 中处理数据重复值与唯一值的三种主要方法:

  • duplicated():用于标记重复行,通过参数设置可以灵活控制重复项的判断方式。
  • drop_duplicates():用于删除重复行,保留每组重复数据中的一条记录,并支持针对指定列进行操作。
  • unique():用于返回 Series 中所有唯一值,是数据探索阶段的重要工具。

通过这些方法,你可以在数据清洗、探索和模型构建过程中有效管理重复数据,确保数据质量。合理选择和组合这些工具,将大大提高数据处理的效率和准确性,为后续的分析和决策提供坚实的数据基础。


7. 参考资料


希望本文能帮助你全面理解并灵活运用 Pandas 中的 duplicated、drop_duplicates 和 unique 方法,从而在数据清洗和探索过程中有效管理重复数据,保证数据分析的准确性和模型训练的高效性。不断实践与总结,将使你在数据科学的道路上取得更优的成果。

;