- 1 1. Introducción
- 2 2. Tres patrones básicos para eliminar elementos duplicados en Python
- 3 3. Procesamiento cuando los elementos son listas u otros objetos no hashable
- 4 4. Aplicación avanzada: extracción solo de duplicados o conteo de apariciones
- 5 5. Eliminación de duplicados en Pandas DataFrame
- 6 6. Comparación de rendimiento y cómo elegir la solución óptima
- 7 7. Resumen
- 8 Frequently Asked Questions (FAQ)
- 8.1 Q1. ¿Cuál es más rápido, set o dict.fromkeys?
- 8.2 Q2. ¿Cómo eliminar duplicados manteniendo el orden original de la lista?
- 8.3 Q3. ¿Qué hacer si la lista contiene otras listas o diccionarios, lo que causa errores al usar set o dict.fromkeys?
- 8.4 Q4. ¿Cómo eliminar duplicados en pandas basándose solo en una columna específica?
- 8.5 Q5. ¿Cómo eliminar todos los elementos duplicados y conservar solo los valores que aparecen una sola vez?
- 8.6 Q6. ¿Cómo verificar filas duplicadas en un DataFrame en lugar de eliminarlas?
- 8.7 Q7. ¿Qué tener en cuenta al eliminar duplicados en datos de cientos de miles de registros?
- 8.8 Q8. ¿Por qué es necesario eliminar duplicados?
1. Introducción
En el ámbito del análisis de datos y la programación, la «eliminación de datos duplicados» es un proceso básico que se puede considerar esencial. Querer eliminar elementos duplicados de listas, arreglos o DataFrames usando Python — esa necesidad se observa en un amplio rango de usuarios, desde principiantes hasta expertos.
Por ejemplo, después de obtener una gran cantidad de datos mediante web scraping o al leer un archivo CSV. No es raro que los mismos valores o filas aparezcan repetidamente. Si se deja esa «duplicación» sin tratar, puede impedir obtener resultados de agregación precisos, generar procesamiento innecesario y provocar diversos problemas.
Python ofrece diversas formas de eliminar duplicados mediante funciones estándar y bibliotecas externas. En este artículo se explican ampliamente desde técnicas básicas para eliminar duplicados en Python hasta usos avanzados y consideraciones importantes. Se presentan ejemplos concretos y puntos clave para cada caso — listas, arreglos y DataFrames — de manera que sea comprensible para principiantes y útil para profesionales que lo aplican en el trabajo.
Se responden preguntas como «¿Qué método debería elegir?» o «¿Por qué cambia el orden?» y se presentan conocimientos prácticos que pueden aplicarse de inmediato en el entorno real.
Si desea eliminar datos duplicados de manera eficiente con Python, le invitamos a consultarlo.
2. Tres patrones básicos para eliminar elementos duplicados en Python
Al eliminar elementos duplicados en listas o arreglos con Python, se utilizan principalmente los siguientes tres métodos. Cada uno tiene sus características, por lo que es importante elegir según el objetivo y la situación.
2.1 Eliminación de duplicados con set (método que no conserva el orden)
El método más simple e intuitivo es usar el tipo de datos estándar de Python, el «set». Un set es una colección que no permite duplicados, por lo que al convertir una lista a un set, los elementos duplicados se eliminan automáticamente.
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = list(set(numbers))
print(unique_numbers) # Ejemplo de salida: [1, 2, 3, 4, 5]
Sin embargo, el set no conserva el orden de los elementos. Por lo tanto, si se necesita mantener el orden original de la lista, se requiere otro método.
2.2 Eliminación manteniendo el orden con dict.fromkeys
A partir de Python 3.7, los diccionarios (dict) conservan el orden de sus claves. La técnica de eliminación de duplicados que aprovecha esto es «dict.fromkeys()». Con este método, se pueden eliminar los duplicados sin alterar el orden original de la lista.
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = list(dict.fromkeys(numbers))
print(unique_numbers) # Ejemplo de salida: [1, 2, 3, 4, 5]
Al poder eliminar duplicados manteniendo el orden con una sola línea concisa, se utiliza en muchas situaciones.
2.3 Conservación del orden y flexibilidad con list comprehension + set
Otro método muy usado es combinar list comprehension con set para eliminar duplicados mientras se conserva el orden. Esta forma permite una mayor flexibilidad en la condición y es fácil de aplicar a estructuras de datos complejas.
numbers = [1, 2, 2, 3, 4, 4, 5]
seen = set()
unique_numbers = [x for x in numbers if not (x in seen or seen.add(x))]
print(unique_numbers) # Ejemplo de salida: [1, 2, 3, 4, 5]
Con este método, se puede describir explícitamente el flujo de «omitir los elementos que ya han aparecido», lo que facilita la eliminación de duplicados condicionada y la gestión de elementos no hashables.
3. Procesamiento cuando los elementos son listas u otros objetos no hashable
La eliminación de duplicados usando set o dict que se ha presentado hasta ahora es eficaz para elementos «hashables» como listas y tuplas. Sin embargo, las listas de Python son objetos «no hashables», por lo que no se pueden usar directamente como claves de set o dict, como listas que contienen listas (listas bidimensionales) o listas de diccionarios. Por lo tanto, se necesita un poco de ingenio.
Por ejemplo, consideremos una lista bidimensional como la siguiente.
data = [[1, 2], [3, 4], [1, 2], [5, 6]]
En este caso, set o dict.fromkeys() producirán un error. Por lo tanto, se utiliza un método que verifica manualmente si ya ha aparecido una lista idéntica y elimina los duplicados.
3.1 Método usando comprensión de listas + listas
Lo más sencillo es mantener una lista de listas ya vistas y añadirlas una a una.
data = [[1, 2], [3, 4], [1, 2], [5, 6]]
unique_data = []
for item in data:
if item not in unique_data:
unique_data.append(item)
print(unique_data) # Ejemplo de salida: [[1, 2], [3, 4], [5, 6]]
Con este método, incluso los elementos no hashables como listas, diccionarios o sets pueden eliminar duplicados manteniendo el orden.
3.2 Generalización mediante función
Definir la lógica como una función resulta útil para hacerla más genérica.
def remove_duplicates(seq):
result = []
for item in seq:
if item not in result:
result.append(item)
return result
data = [[1, 2], [3, 4], [1, 2], [5, 6]]
print(remove_duplicates(data)) # [[1, 2], [3, 4], [5, 6]]
3.3 Rendimiento y consideraciones
Este método tiene la ventaja de mantener el orden, pero cuando la lista es grande, el costo de búsqueda de item not in result
aumenta. Es práctico para varios miles de elementos, pero para datos que superen decenas de miles, conviene considerar otras técnicas (por ejemplo, convertir los elementos a tuplas y gestionarlos con set).
4. Aplicación avanzada: extracción solo de duplicados o conteo de apariciones
La eliminación de duplicados es básica en el preprocesamiento de datos, pero en la práctica real, hay solicitudes frecuentes como «quiero extraer solo los elementos duplicados» o «quiero contar cuántas veces aparece cada elemento». En Python, estos procesos también se pueden realizar fácilmente usando la biblioteca estándar.
4.1 Extraer solo los elementos duplicados
Si quieres extraer solo los «elementos que aparecen múltiples veces» de una lista, es conveniente usar la clase Counter
del módulo collections.
from collections import Counter
data = [1, 2, 2, 3, 4, 4, 4, 5]
counter = Counter(data)
duplicates = [item for item, count in counter.items() if count > 1]
print(duplicates) # Ejemplo de salida: [2, 4]
Con este método, puedes extraer de un vistazo los «elementos con duplicados». Por supuesto, también se puede usar con cadenas u otros objetos hashables.
4.2 Contar la cantidad de apariciones de cada elemento
Counter
también permite obtener fácilmente el número de apariciones de cada elemento. Como se puede usar para agregaciones y análisis de frecuencia, es muy valioso en el campo del análisis de datos.
from collections import Counter
data = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
counter = Counter(data)
print(counter) # Ejemplo de salida: Counter({'apple': 3, 'banana': 2, 'orange': 1})
El objeto Counter se puede usar de la misma manera que un diccionario, por lo que puedes investigar fácilmente cuántas veces aparece un elemento específico.

4.3 Eliminar todos los duplicados (conservar solo los elementos únicos)
Si quieres eliminar todos los elementos duplicados y conservar solo los «elementos que aparecen una sola vez», también puedes usar Counter.
from collections import Counter
data = [1, 2, 2, 3, 4, 4, 5]
counter = Counter(data)
unique_items = [item for item, count in counter.items() if count == 1]
print(unique_items) # Ejemplo de salida: [1, 3, 5]
De esta manera, dependiendo del uso o propósito de los datos, puedes realizar de manera flexible diversas extracciones y agregaciones como «solo duplicados», «número de apariciones», «elementos únicos», etc.
5. Eliminación de duplicados en Pandas DataFrame
En el análisis de datos y en entornos de aprendizaje automático, se utiliza frecuentemente el DataFrame de pandas. pandas, que permite manejar datos tabulares de manera eficiente, cuenta con funciones útiles especializadas en la detección y eliminación de datos duplicados.
5.1 drop_duplicates() para eliminar filas duplicadas
El método más utilizado en pandas es drop_duplicates()
. Esta función permite eliminar fácilmente filas (o columnas) duplicadas de un DataFrame o Series.
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Alice', 'David'],
'age': [24, 27, 24, 32]
})
df_unique = df.drop_duplicates()
print(df_unique)
# Ejemplo de salida:
# name age
# 0 Alice 24
# 1 Bob 27
# 3 David 32
En este ejemplo, si hay filas con contenido idéntico, solo se conserva la primera de ellas.
5.2 Determinar duplicados usando solo columnas específicas (argumento subset)
Si se desea determinar duplicados basándose solo en columnas específicas, se utiliza el argumento subset
.
df_unique_name = df.drop_duplicates(subset=['name'])
print(df_unique_name)
# Ejemplo de salida:
# name age
# 0 Alice 24
# 1 Bob 27
# 3 David 32
En este caso, solo se consideran duplicados los de la columna 「name」.
5.3 Marcar filas duplicadas con duplicated()
Si se desea identificar qué filas están duplicadas en lugar de eliminarlas, se utiliza el método duplicated()
.
print(df.duplicated())
# Ejemplo de salida:
# 0 False
# 1 False
# 2 True
# 3 False
# dtype: bool
Las filas duplicadas se indican con True
, y las que no lo son con False
. Con esto, también es posible extraer o eliminar solo las filas duplicadas.
5.4 Opciones comunes (keep, inplace, ignore_index)
- keep:
'first'
(predeterminado. conserva solo la primera),'last'
(conserva solo la última),False
(elimina todos los duplicados) - inplace:
True
para actualizar directamente el DataFrame original - ignore_index:
True
para que los índices se reasignen
df.drop_duplicates(subset=['name'], keep=False, inplace=True)
En este ejemplo, se eliminan todas las filas donde la columna 「name」 está duplicada。
6. Comparación de rendimiento y cómo elegir la solución óptima
Al eliminar duplicados en Python, el método elegido puede producir diferencias significativas en la velocidad de ejecución y la eficiencia de memoria. Aquí se explica la tendencia de rendimiento de los métodos más usados y cómo elegir la opción óptima según el caso de uso.
6.1 Comparación de velocidad de set y dict.fromkeys
En general, la eliminación de duplicados usando set
o dict.fromkeys
es extremadamente rápida.
- set: es el más simple y rápido. Sin embargo, no conserva el orden.
- dict.fromkeys: es óptimo cuando se necesita conservar el orden. Desde Python 3.7, mantiene el orden de inserción y permite un procesamiento rápido.
Ambos pueden procesar listas de decenas de miles de elementos sin problemas. Sin embargo, dict.fromkeys no se puede usar con elementos que no son hashables (no pueden ser claves).
6.2 Comparación con comprensión de listas + set
La comprensión de listas + set (usando seen
) se caracteriza por mantener el orden y ofrecer una velocidad relativamente alta.
Sin embargo, es ligeramente más lenta que set o dict.fromkeys (la diferencia tiende a crecer a medida que aumenta el número de elementos).
Este método es particularmente útil cuando se requiere flexibilidad, como «eliminar duplicados bajo ciertas condiciones» o «soportar estructuras de datos complejas».
6.3 En caso de elementos no hashables
Si la lista contiene listas o diccionarios, el costo de búsqueda de item not in result
se vuelve O(n^2), por lo que el procesamiento se vuelve lento al superar varios miles de elementos.
Cuando se necesita conservar el orden con grandes volúmenes de datos, considere revisar la propia estructura de datos (convertir a tuplas, gestionar mediante IDs, etc.).
6.4 Rendimiento de drop_duplicates de pandas
El drop_duplicates
de pandas está optimizado internamente y funciona rápidamente incluso con datos de cientos de miles a un millón de filas.
Sin embargo, si se combinan condiciones complejas o se especifican muchas columnas, el tiempo de procesamiento puede incrementarse ligeramente. También es necesario prestar atención al uso de memoria.
6.5 Resumen de directrices para la selección
- Cuando el volumen de datos es grande y el orden no importa:
set
es el más rápido - Cuando también se desea preservar el orden:
dict.fromkeys
o comprensión de listas + set - En caso de elementos no hashables o condiciones complejas: comprensión de listas + lista, o convertir en una función
- Para análisis de datos, grandes volúmenes o CSV, etc.: pandas
drop_duplicates
- Cuando también se necesita contar la frecuencia o agregar elementos duplicados:
collections.Counter
Elija el método óptimo según las características y el uso de sus datos, teniendo en cuenta las particularidades de cada enfoque.
7. Resumen
La eliminación de duplicados en Python es una técnica esencial en el procesamiento y análisis de datos. En este artículo, explicamos de manera sistemática, desde lo básico hasta lo avanzado, los métodos para eliminar duplicados en listas, arrays y DataFrames de pandas.
Los puntos principales se resumen a continuación.
- set permite eliminar duplicados de la manera más simple y rápida. Sin embargo, el orden no se conserva.
- dict.fromkeys o list comprehension + set permite eliminar duplicados manteniendo el orden original.
- Elementos no hashables (como listas o diccionarios) pueden manejarse eficazmente con un enfoque de comprensión + lista, como
item not in result
. - Al usar collections.Counter, puedes extraer solo los elementos duplicados y contar sus ocurrencias, lo que permite análisis y agregaciones más detalladas.
- drop_duplicates y duplicated de pandas ofrecen una potente funcionalidad de eliminación de duplicados que soporta grandes volúmenes de datos, siendo indispensable en el análisis de datos.
Además, cada método tiene sus fortalezas y debilidades, así como diferencias en velocidad y eficiencia de memoria. Si la velocidad de procesamiento es crucial, si necesitas preservar el orden, o si trabajas con datos no hashables, elegir el método adecuado según tu situación y las características de los datos es la clave para un procesamiento eficiente y preciso. Eliminar duplicados parece simple pero es profundo; conocer el método correcto hace que el procesamiento de datos en Python sea mucho más fluido. Aprovecha el contenido de este artículo en tu trabajo o estudio.
Frequently Asked Questions (FAQ)
Q1. ¿Cuál es más rápido, set o dict.fromkeys?
En general, la eliminación de duplicados usando set es la más rápida. Sin embargo, set no conserva el orden de los elementos. Si deseas mantener el orden, usa dict.fromkeys. Los dict.fromkeys de Python 3.7 en adelante también son bastante rápidos, por lo que puedes elegir según el caso de uso.
Q2. ¿Cómo eliminar duplicados manteniendo el orden original de la lista?
dict.fromkeys, o una comprensión de lista + set (usando un conjunto seen) son efectivos. Ambos pueden mantener el orden. Usar solo set rompe el orden.
Q3. ¿Qué hacer si la lista contiene otras listas o diccionarios, lo que causa errores al usar set o dict.fromkeys?
Los elementos no hashables (listas, diccionarios, etc.) no pueden usarse como claves en set o dict. En ese caso, la forma más segura es comprobar manualmente con una lista si ya se ha añadido y usar append (bucle for + if, o mediante una función).
Q4. ¿Cómo eliminar duplicados en pandas basándose solo en una columna específica?
Utiliza el argumento subset de drop_duplicates. Por ejemplo, df.drop_duplicates(subset=['name'])
, lo que permite determinar duplicados solo en la columna ‘name’.
Q5. ¿Cómo eliminar todos los elementos duplicados y conservar solo los valores que aparecen una sola vez?
Utiliza collections.Counter y extrae solo los elementos cuya frecuencia sea 1.
from collections import Counter
data = [1, 2, 2, 3, 4, 4, 5]
counter = Counter(data)
unique_items = [item for item, count in counter.items() if count == 1]
# unique_items = [1, 3, 5]
Q6. ¿Cómo verificar filas duplicadas en un DataFrame en lugar de eliminarlas?
Usa el método duplicated(). Las filas duplicadas devuelven True, las demás False. También puedes usarlo para extraer solo las partes duplicadas.
Q7. ¿Qué tener en cuenta al eliminar duplicados en datos de cientos de miles de registros?
set y pandas drop_duplicates son robustos para grandes volúmenes, pero pueden aumentar significativamente el uso de memoria y el tiempo de ejecución. Considera muestrear o procesar en partes según sea necesario.
Q8. ¿Por qué es necesario eliminar duplicados?
Mantener datos duplicados puede conducir a resultados erróneos en análisis estadísticos, generación de gráficos, aprendizaje automático, etc. Para análisis y agregaciones confiables, la eliminación de duplicados es un preprocesamiento importante.