在数据处理工作中,重复行是极其常见的问题。Pandas提供的drop_duplicates方法能够帮助我们快速识别并移除DataFrame中的重复记录。理解它的参数设计和执行逻辑,是写出可靠数据清洗代码的基础。

drop_duplicates方法基本用法
drop_duplicates是DataFrame对象的内置方法,调用后会返回一个新的DataFrame,其中剔除了被判定为重复的行。默认情况下,它会比较所有列的值,只有当每一列都完全相同时,才认为两行重复。这种全列比对方式适合结构整齐、无无关噪声列的数据集。
下面是一段最基础的示例,展示如何对包含重复行的数据进行整体去重:
import pandas as pd
data = {
'name': ['张三', '李四', '张三', '王五', '李四'],
'score': [88, 75, 88, 90, 75]
}
df = pd.DataFrame(data)
print('去重前:')
print(df)
df_clean = df.drop_duplicates()
print('去重后:')
print(df_clean)
上述代码中,两条“张三,88”和两条“李四,75”会被识别为重复,最终仅保留各自首次出现的记录。如果不希望生成新对象,而是直接修改原DataFrame,可以传入参数inplace=True,此时方法返回值为None,原对象被改变。
基于指定列子集去重
真实业务里,我们往往只关心某些关键字段是否重复,例如用户ID或订单编号,而不希望因为某一列无关信息不同就保留重复主体。这时应使用subset参数,传入一个列名列表,告诉Pandas只在这些列上做判重。
以下示例仅根据name列去重,忽略score差异:
import pandas as pd
data = {
'name': ['张三', '李四', '张三', '王五', '李四'],
'score': [88, 75, 92, 90, 80]
}
df = pd.DataFrame(data)
# 仅按name去重,保留首次出现
df_sub = df.drop_duplicates(subset=['name'])
print(df_sub)
运行后,第二个“张三”和第二个“李四”因name重复被删除,即使它们的score不同。这在按主体归并数据时非常实用。但要注意,如果subset指定的列中存在空值NaN,Pandas会认为NaN与NaN之间不算相同,因此含NaN的行不会被当作重复项移除,这是初学者经常踩的坑。
控制保留策略与索引重置
keep参数决定了当重复出现时保留哪一条。可选值为first(默认,保留第一次出现)、last(保留最后一次出现)以及False(全部重复项都不保留,只留唯一值)。合理选择keep可以在时间序列数据中保留最新或最旧记录。
同时,去重后原索引会保留,可能出现不连续的情况。若想获得从0开始的新索引,可设置ignore_index=True。
import pandas as pd
data = {
'order_id': ['A1', 'A2', 'A1', 'A3', 'A2'],
'amount': [100, 200, 150, 300, 250]
}
df = pd.DataFrame(data)
# 按order_id去重,保留最后一次,重置索引
df_last = df.drop_duplicates(
subset=['order_id'],
keep='last',
ignore_index=True
)
print(df_last)
在这个例子中,同样order_id的不同金额记录,程序保留了后面出现的那一条,并且索引被整理为0、1、2。相比手动写循环比对,drop_duplicates在底层使用了哈希表优化,处理百万级数据时效率明显高于纯Python写法。
去重逻辑中的常见误区
一个容易混淆的概念是:drop_duplicates并不会修改原始数据,除非显式设置inplace=True。很多人在调用后打印原变量,发现重复行还在,便误以为方法失效。实际上应接收返回值或确认inplace行为。
另外,当DataFrame包含浮点数列时,由于精度问题,看似相等的数可能被判定为不同。若业务允许,可先使用round函数统一精度再去重,或借助numpy的isclose做自定义判重逻辑,而不是单纯依赖drop_duplicates的默认等值比较。
import pandas as pd
data = {
'val': [0.1 + 0.2, 0.3, 0.1 + 0.2, 0.4]
}
df = pd.DataFrame(data)
# 先四舍五入再去重
df['val'] = df['val'].round(2)
df_unique = df.drop_duplicates()
print(df_unique)
通过上述处理,0.1+0.2与0.3在保留两位小数后都被视为0.3,从而被正确识别为重复。掌握这些细节,才能让Pandas去重真正服务于干净的数据管道。
Pandasdrop_duplicates数据去重修改时间:2026-08-05 01:33:24