📖 知识点
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")
⚠️ 易错提醒
drop_duplicates()默认返回新表,不改原表;要改原表用inplace=True或重新赋值- 默认按 "所有列" 判断重复;只想按某一列去重,用
subsetkeep控制保留哪条:first(首条)、last(末条)、False(全部删除)
⚔️ Kata 实战任务
任务需求:
- 导入 pandas,创建一份含重复行的数据(菜名、价格、数量)
- 用
df.drop_duplicates()删除完全重复的行 - 用
subset=["菜名"]按菜名去重,保留第一条 - 用
subset=["菜名"], keep="last"按菜名去重,保留最后一条 - 对比三种结果,理解去重逻辑
参考代码
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):每种菜只留最后一条,顺序会变化
🧠 思考题
drop_duplicates()默认按什么判断重复?想只看 "菜名" 是否重复,该加什么参数?- 去重后原表有没有被修改?想让原表也变,该怎么做?
行者孙Python