pandas去重函数-drop_duplicates()

1.1 函数语法

df.drop_duplicates(
    subset=None, 
    keep='first', 
    inplace=False, 
    ignore_index=False
)

1.2 参数详解

1.2.1 ​subset (默认: None)

指定用于识别重复的列标签或列标签序列。

import pandas as pd
import numpy as np

# 示例数据
df = pd.DataFrame({
    '平台SKU': ['A001', 'A001', 'A002', 'A002', 'A003'],
    '仓库编码': ['WH01', 'WH01', 'WH02', 'WH02', 'WH01'],
    '数量': [10, 10, 20, 25, 30],
    '价格': [100, 100, 200, 200, 300]
})

# 1.1 不指定subset:基于所有列判断重复
df_all_columns = df.drop_duplicates()
print("基于所有列去重:")
print(df_all_columns)

# 1.2 指定单列
df_sku = df.drop_duplicates(subset=['平台SKU'])
print("\n基于平台SKU去重:")
print(df_sku)

# 1.3 指定多列(您的用法)
df_sku_warehouse = df.drop_duplicates(subset=['平台SKU', '仓库编码'])
print("\n基于平台SKU和仓库编码去重:")
print(df_sku_warehouse)

# 1.4 使用列索引
df_by_index = df.drop_duplicates(subset=[0, 1])  # 基于第0列和第1列

1.2.2 ​keep (默认: ‘first’)

决定保留哪些重复行。

# 2.1 keep='first' (默认) - 保留第一次出现的行
df_first = df.drop_duplicates(subset=['平台SKU', '仓库编码'], keep='first')
print("保留第一次出现:")
print(df_first)

# 2.2 keep='last' - 保留最后一次出现的行
df_last = df.drop_duplicates(subset=['平台SKU', '仓库编码'], keep='last')
print("\n保留最后一次出现:")
print(df_last)

# 2.3 keep=False - 删除所有重复行(不保留任何重复)
df_none = df.drop_duplicates(subset=['平台SKU', '仓库编码'], keep=False)
print("\n删除所有重复行:")
print(df_none)

# 注意:当 keep=False 时,所有重复的行都会被删除

1.2.3 ​inplace (默认: False)

是否在原地修改 DataFrame。

# 3.1 inplace=False (默认) - 返回新DataFrame,原DataFrame不变
df_copy = df.copy()
new_df = df_copy.drop_duplicates(subset=['平台SKU', '仓库编码'])
print(f"原DataFrame行数: {len(df_copy)}")
print(f"新DataFrame行数: {len(new_df)}")
print(f"原DataFrame是否改变: {len(df_copy) == len(df)}")

# 3.2 inplace=True - 直接修改原DataFrame
df_copy2 = df.copy()
df_copy2.drop_duplicates(subset=['平台SKU', '仓库编码'], inplace=True)
print(f"\ninplace=True 后行数: {len(df_copy2)}")

1.2.4 ​ignore_index (默认: False)

是否重新设置索引。

# 4.1 ignore_index=False (默认) - 保持原索引
df_keep_index = df.drop_duplicates(subset=['平台SKU', '仓库编码'], keep='first')
print("保持原索引:")
print(df_keep_index)

# 4.2 ignore_index=True - 重置索引为0, 1, 2...
df_reset_index = df.drop_duplicates(subset=['平台SKU', '仓库编码'], keep='first', ignore_index=True)
print("\n重置索引:")
print(df_reset_index)

1.3 使用 duplicated()方法先查看重复行

python

# 3.1 查看哪些行是重复的(不包括第一次出现的)
duplicate_mask = df.duplicated(subset=['平台SKU', '仓库编码'], keep='first')
print("重复行(不包括第一次):")
print(df[duplicate_mask])

# 3.2 查看所有重复行(包括第一次出现的)
duplicate_all_mask = df.duplicated(subset=['平台SKU', '仓库编码'], keep=False)
print("\n所有重复行:")
print(df[duplicate_all_mask])

# 3.3 统计重复行数
duplicate_count = df.duplicated(subset=['平台SKU', '仓库编码'], keep=False).sum()
print(f"\n重复行总数: {duplicate_count}")

1.4 总结

drop_duplicates() 函数的强大之处在于:

  1. 灵活性:可以基于单列、多列或所有列去重
  2. 控制性​:通过 keep 参数可以控制保留哪个重复行
  3. 内存友好​:通过 subset 参数可以只考虑关键列
  4. 与其它操作结合:可以轻松与排序、分组、过滤等操作结合
文末声明:

您必须遵守关于,您可以随意转发/引用,但要注明原作者Leon或设置本文跳转连接,并且您必须在文中包含或提醒浏览者遵守作者声明
欢迎关注公众号获取第二手文章!高效工作法

暂无评论

发送评论 编辑评论


				
上一篇