Función Pandas df.drop_duplicates()
df.drop_duplicates()Es la función de Pandas utilizada para eliminar filas duplicadas.
En el proceso de recopilación e integración de datos, los datos duplicados son un problema común.drop_duplicates()Puede ayudarte a identificar y eliminar filas duplicadas según las columnas especificadas o todas las columnas, conservando el primer o el último registro que aparezca. Esto es muy útil para la deduplicación de datos y para garantizar la unicidad de los datos.
Sintaxis básica y parámetros
drop_duplicates()Es una función miembro de DataFrame, mediante el operador de punto.para llamarla.
Formato de sintaxis
DataFrame.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)
Descripción de parámetros
| Parámetro | Tipo | Requerido | Descripción | Valor predeterminado |
|---|---|---|---|---|
| subset | column label o list | Opcional | Especifica las columnas utilizadas para determinar los duplicados. Si esNone, se utilizan todas las columnas. Puede ser un solo nombre de columna o una lista de nombres de columnas. |
None |
| keep | str o False | Opcional | Especifica qué registro duplicado conservar.'first'Conservar el primero;'last'Conservar el último;FalseEliminar todos los registros duplicados. |
'first' |
| inplace | bool | Opcional | Si esTrue, modifica directamente el DataFrame original y no devuelve un nuevo objeto; si esFalse, devuelve un nuevo DataFrame y los datos originales no cambian. |
False |
| ignore_index | bool | Opcional | Si esTrue, restablece el índice del resultado y numera desde 0; si esFalse, conserva el índice original. |
False |
Descripción del valor de retorno
- Devuelve un nuevo DataFrame (si
inplace=False), oNone(siinplace=True)。 - El DataFrame devuelto no contiene filas duplicadas.
Ejemplos
Vamos a dominar completamente, mediante una serie de ejemplos,drop_duplicates()el uso de df.drop_duplicates().
Ejemplo 1: Eliminar filas completamente duplicadas
De forma predeterminada, se determina si una fila está duplicada según todas las columnas.
Ejemplo
import numpy as np
# Crear un DataFrame que contiene filas duplicadas
data = {
'Nombre': ['Zhang San', 'Li Si', 'Zhang San', 'Wang Wu', 'Li Si'],
'Edad': [25, 30, 25, 35, 30],
'Departamento': ['Tecnología', 'Mercado', 'Tecnología', 'Tecnología', 'Mercado']
}
df = pd.DataFrame(data)
print("datos originales:")
print(df)
print("=" * 50)
# Eliminar filas duplicadas, conservando la primera aparición
df_cleaned = df.drop_duplicates()
print("Datos después de eliminar las filas duplicadas:")
print(df_cleaned)
Resultado esperado:
原始数据:
姓名 年龄 部门
0 张三 25 技术
1 李四 30 市场
2 张三 25 技术
3 王五 35 技术
4 李四 30 市场
==================================================
删除重复行后的数据:
0 姓名 年龄 部门
0 张三 25 技术
1 李四 30 市场
3 王五 35 技术
Análisis del código:
- En los datos originales, la fila 0 y la fila 2 son completamente idénticas (Zhang San, 25 años, departamento técnico).
- La fila 1 y la fila 4 también son completamente idénticas (Li Si, 30 años, departamento de marketing).
- Usando
drop_duplicates()los parámetros predeterminados, se eliminan las filas duplicadas y se conserva la primera aparición.
Ejemplo 2: Eliminar filas duplicadas según columnas especificadas
Se puede usarsubsetel parámetro subset para determinar duplicados solo según columnas específicas.
Ejemplo
import numpy as np
# Crear un DataFrame
data = {
'Nombre': ['Zhang San', 'Li Si', 'Zhang San', 'Wang Wu'],
'Edad': [25, 30, 28, 35], # Zhang San aparece dos veces, pero con edades diferentes
'Departamento': ['Tecnología', 'Mercado', 'Tecnología', 'Mercado']
}
df = pd.DataFrame(data)
print("datos originales:")
print(df)
print("=" * 50)
# Determinar duplicados solo según la columna "nombre"
df_cleaned = df.drop_duplicates(subset=['Nombre'])
print(Datos después de eliminar duplicados según la columna de nombre:)
print(df_cleaned)
print("=" * 50)
<<<SEP>>> # Determinar duplicados según las columnas "Nombre" y "Departamento"
df_cleaned2 = df.drop_duplicates(subset=['Nombre', 'Departamento'])
print("Datos después de eliminar duplicados según las columnas de nombre y departamento:")
print(df_cleaned2)
Resultado esperado:
原始数据:
姓名 年龄 部门
0 张三 25 技术
1 李四 30 市场
2 张三 28 技术 # 虽然姓名重复,但年龄不同
3 王五 35 市场
==================================================
根据姓名列删除重复后的数据:
姓名 年龄 部门
0 张三 25 技术 # 保留第一条张三的记录
2 张三 28 技术
3 王五 35 市场
==================================================
根据姓名和部门列删除重复后的数据:
参数
姓名 年龄 部门
0 张三 25 技术
1 李四 30 市场
3 王五 35 市场
Análisis del código:
- Al determinar según la columna de nombre, tanto la fila 0 como la fila 2 tienen el nombre "Zhang San", por lo que se consideran filas duplicadas y solo se conserva la fila 0.
- Al determinar según las columnas de nombre y departamento, la fila 0 y la fila 2 tienen el mismo nombre y departamento, por lo que se conserva la fila 0.
Ejemplo 3: Conservar el último registro duplicado
Usandokeep='last'el parámetro keep se puede conservar el último registro duplicado que aparece.
Ejemplo
import numpy as np
# Crear un DataFrame que contiene filas duplicadas
data = {
Número de estudiante: ['S001', 'S002', 'S001', 'S003', 'S002'],
'Nombre': ['Zhang San', 'Li Si', 'Zhang San', 'Wang Wu', 'Li Si'],
'Calificaciones': [85, 90, 88, 92, 85] # Para el mismo "número de estudiante", las calificaciones pueden ser diferentes
}
df = pd.DataFrame(data)
print("datos originales:")
print(df)
print("=" * 50)
# Conservar el primer registro (por defecto)
df_first = df.drop_duplicates(subset=[Número de estudiante], keep='first')
print("Mantener el primer registro de los duplicados:")
print(df_first)
print("=" * 50)
# Conservar el último registro
df_last = df.drop_duplicates(subset=[Número de estudiante], keep='last')
print("Conservar el último registro duplicado:")
print(df_last)
Resultado esperado:
原始数据:
学号 姓名 成绩
0 S001 张三 85
1 S002 李四 90
2 S001 张三 88 # 同一个人,成绩不同
3 S王五 92
4 S002 李四 85 # 同一个人,成绩不同
==================================================
保留第一条重复记录:
学号 姓名 成绩
0 S001 张三 85 # 保留第一个85分
1 S002 李四 90 # 保留第一个90分
3 王五 92
==================================================
保留最后一条重复记录:
学号 姓名 成绩
2 S001 张三 88 # 保留最后一个88分
3 王五 92
4 S002 李四 85 # 保留最后一个85分
Análisis del código:
- El ID de estudiante S001 tiene dos registros, con calificaciones de 85 y 88 respectivamente; usando
keep='first'se conserva el de 85 puntos;keep='last'se conserva el de 88 puntos. - El número de estudiante S002 también tiene dos registros, con calificaciones de 90 y 85.
- Según las necesidades del negocio, elige conservar el primero o el último.
Ejemplo 4: Eliminar todos los registros duplicados
Usandokeep=Falsese pueden eliminar todos los registros duplicados y conservar solo las filas completamente únicas.
Ejemplo
import numpy as np
# Crear un DataFrame
data = {
'A': [1, 1, 2, 2, 3],
'B': [1, 1, 2, 2, 3],
'C': [1, 2, 3, 3, 5]
}
df = pd.DataFrame(data)
print("datos originales:")
print(df)
print("=" * 50)
# Eliminar todas las filas duplicadas (no conservar ninguna duplicada)
df_cleaned = df.drop_duplicates(keep=False)
print(Datos después de eliminar todas las filas duplicadas:)
print(df_cleaned)
Resultado esperado:
原始数据: A B C 0 1 1 1 1 1 1 2 # 与第0行A和B相同,是重复行 2 2 2 3 3 2 2 3 # 与第2行完全相同,是重复行 4 3 3 5 ================================================== 删除所有重复行后的数据: A B C 4 3 3 5
Análisis del código:
- Las filas 0 y 1 tienen los mismos valores en las columnas A y B, por lo que son filas duplicadas; debido a
keep=False, ambas se eliminan. - Las filas 2 y 3 también están completamente duplicadas, por lo que se eliminan.
- Solo la fila 4 es completamente única, por lo que se conserva.
Ejemplo 5: Restablecer el índice
Después de eliminar filas duplicadas, el índice original puede volverse no consecutivo; se puede usarignore_index=Trueel parámetro ignore_index para restablecer el índice.
Ejemplo
import numpy as np
# Crear un DataFrame que contiene filas duplicadas
data = {
'Nombre': ['Zhang San', 'Li Si', 'Zhang San', 'Wang Wu'],
'Ciudad': ['Pekín', Shanghái, 'Pekín', 'Guangzhou']
}
df = pd.DataFrame(data)
print("datos originales:")
print(df)
print("=" * 50)
# Eliminar filas duplicadas, sin restablecer el índice
df_cleaned1 = df.drop_duplicates()
print(Eliminar filas duplicadas (conservando el índice original):)
print(df_cleaned1)
print("=" * 50)
# Eliminar filas duplicadas, restableciendo el índice
df_cleaned2 = df.drop_duplicates(ignore_index=True)
print(Eliminar filas duplicadas (restablecer índice):)
print(df_cleaned2)
Resultado esperado:
原始数据:
姓名 城市
0 张三 北京
1 李四 上海
2 张三 北京
3 王五 广州
==================================================
删除重复行(保留原始索引):
姓名 城市
0 张三 北京
1 李四 上海
3 王五 广州
==================================================
删除重复行(重置索引):
姓名 城市
0 张三 北京
1 李四 上海
2 王五 广州
Análisis del código:
- Sin usar
ignore_indexignore_index, después de eliminar la fila 2, los índices son 0, 1, 3, no consecutivos. - Usando
ignore_index=Trueignore_index, los índices se renumeran desde 0, quedando 0, 1, 2.
Ejemplo 6: Combinar con otras operaciones
drop_duplicates()Se puede combinar con otras operaciones de DataFrame.
Ejemplo
import numpy as np
# Simula datos obtenidos de una consulta a la base de datos
data = {
'Número de pedido': ['O001', 'O002', 'O001', 'O003', 'O002', 'O004'],
'Nombre del cliente': ['Zhang San', 'Li Si', 'Zhang San', 'Wang Wu', 'Li Si', 'Zhao Liu'],
'Importe': [100, 200, 100, 300, 200, 400],
'Fecha': ['2024-01-01', '2024-01-02', '2024-01-01', '2024-01-03', '2024-01-02', '2024-01-04']
}
df = pd.DataFrame(data)
print("Datos originales de pedidos:")
print(df)
print("=" * 50)
# Ver cuántos pedidos duplicados hay
print(f"Número total de filas: {len(df)}")
print(f"Número de filas después de eliminar duplicados: {len(df.drop_duplicates())}")
print(f"Número de filas duplicadas: {len(df) - len(df.drop_duplicates())}")
print("=" * 50)
# Elimina realmente los duplicados, conserva la primera aparición y solo las columnas necesarias
df_unique = df.drop_duplicates(subset=['Número de pedido'])[['Número de pedido', 'Nombre del cliente', 'Importe']]
print("Datos de pedidos después de eliminar duplicados:")
print(df_unique)
Resultado esperado:
原始订单数据:
订单号 客户名 金额 日期
0 O001 张三 100 2024-01-01
1 O002 李四 200 2024-01-02
2 O001 张三 100 2024-01-01 # 重复订单
3 O003 王五 300 2024-01-03
4 O002 李四 200 2024-01-02 # 重复订单
5 O004 赵六 400 2024-01-04
================================================++
总行数: 6
去重后行数: 4
重复行数: 2
Análisis del código:
- Los datos originales tienen 6 filas; hay 2 pedidos duplicados (O001 y O002 aparecen dos veces cada uno).
- Usando
drop_duplicates(subset=['订单号'])elimina duplicados según el número de pedido. - Combinando con la selección de columnas
[['Número de pedido', 'Nombre del cliente', 'Monto']], solo conserva las columnas necesarias.
Notas
drop_duplicates()Por defecto no modifica el DataFrame original; si quieres modificarlo en el lugar, usainplace=Trueel parámetro.- Usando
subsetel parámetro, solo se determina la duplicación según las columnas especificadas; los valores de otras columnas no afectan el juicio. - Usar
keep=Falseeliminará todas las filas duplicadas, lo que puede causar una gran pérdida de datos; utilízalo con precaución. - Antes de eliminar datos duplicados, se recomienda analizar primero la causa de la duplicación para asegurarse de que la eliminación cumpla con la lógica del negocio.
- Si hay valores faltantes (NaN) en los datos, por defecto se consideran el mismo valor para la comparación.
Otras extensiones