择洗篇-Day8|择菜去重:drop_duplicates 去重数据

0 次阅读 2026-10-21 14:36

📖 知识点

1. 为什么要去重?

数据里出现重复行(同一条记录出现多次),会干扰统计结果 —— 比如算销量合计时被翻倍、算平均值时被拉偏。去重是数据清洗的第一步,让数据 "干净且真实"。

💡 生活比喻 采购清单里 "白菜" 记了两遍,结账就会算两次钱。择菜去重就是划掉重复的那条,只留一份。

2. drop_duplicates () 基本用法

df.drop_duplicates()

删除所有列完全重复的行,保留每个重复组的第一条,返回新 DataFrame。

示例:

import pandas as pd

data = {
    "菜名": ["白菜", "番茄", "白菜", "土豆"],
    "价格": [3, 5, 3, 2],
}
df = pd.DataFrame(data)
print(df.drop_duplicates())

运行输出:

   菜名  价格
0  白菜    3
1  番茄    5
3  土豆    2

观察:原本下标 0 和 2 都是 "白菜 3",去重后只留了第一条(下标 0)。

3. 常用参数

参数作用例子
subset按指定列判断重复subset=["菜名"]
keep保留哪条(first 首条 /last 末条 / False 全删)keep="last"
inplace是否原地修改原表inplace=True

按某列去重(只看菜名是否重复):

# 按"菜名"列去重,保留第一条
df.drop_duplicates(subset=["菜名"])

保留最后一条:

df.drop_duplicates(subset=["菜名"], keep="last")

⚠️ 易错提醒

  1. drop_duplicates() 默认返回新表,不改原表;要改原表用 inplace=True 或重新赋值
  2. 默认按 "所有列" 判断重复;只想按某一列去重,用 subset
  3. keep 控制保留哪条:first(首条)、last(末条)、False(全部删除)

⚔️ Kata 实战任务

任务需求:

  1. 导入 pandas,创建一份含重复行的数据(菜名、价格、数量)
  2. 用 df.drop_duplicates() 删除完全重复的行
  3. 用 subset=["菜名"] 按菜名去重,保留第一条
  4. 用 subset=["菜名"], keep="last" 按菜名去重,保留最后一条
  5. 对比三种结果,理解去重逻辑

参考代码

import pandas as pd

# 一份含重复行的采购清单
data = {
    "菜名": ["白菜", "番茄", "白菜", "土豆", "番茄"],
    "价格": [3, 5, 3, 2, 5],
    "数量": [10, 20, 10, 30, 25],
}
df = pd.DataFrame(data)
print("===== 原始数据 =====")
print(df)

print("\n===== 1. 完全重复去重 =====")
print(df.drop_duplicates())

print("\n===== 2. 按菜名去重,保留第一条 =====")
print(df.drop_duplicates(subset=["菜名"]))

print("\n===== 3. 按菜名去重,保留最后一条 =====")
print(df.drop_duplicates(subset=["菜名"], keep="last"))

运行输出:

===== 原始数据 =====
   菜名  价格  数量
0  白菜    3   10
1  番茄    5   20
2  白菜    3   10
3  土豆    2   30
4  番茄    5   25

===== 1. 完全重复去重 =====
   菜名  价格  数量
0  白菜    3   10
1  番茄    5   20
3  土豆    2   30
4  番茄    5   25

===== 2. 按菜名去重,保留第一条 =====
   菜名  价格  数量
0  白菜    3   10
1  番茄    5   20
3  土豆    2   30

===== 3. 按菜名去重,保留最后一条 =====
   菜名  价格  数量
3  土豆    2   30
4  番茄    5   25
0  白菜    3   10

💡 对比观察:

  • 完全去重:删掉了完全一样的行 0 和 2 重复的那条(保留行 0)
  • 按菜名去重(first):每种菜只留第一条
  • 按菜名去重(last):每种菜只留最后一条,顺序会变化

🧠 思考题

  1. drop_duplicates() 默认按什么判断重复?想只看 "菜名" 是否重复,该加什么参数?
  2. 去重后原表有没有被修改?想让原表也变,该怎么做?