Procesamiento de datos duplicados en Pandas

Los datos duplicados son un problema común en el análisis de datos y pueden afectar la precisión de los resultados estadísticos. Pandas proporciona funcionalidades completas para detectar y tratar datos duplicados.


Detección de datos duplicados

Método duplicated

Ejemplo

import pandas as pd

# Crear un DataFrame con filas duplicadas
df = pd.DataFrame({
    Nombre: [Zhang San, Li Si, Wang Wu, Zhang San, Li Si, Zhao Liu],
    Edad: [25, 30, 28, 25, 30, 35],
    Ciudad: [Beijing, Shanghai, Guangzhou, Beijing, Shenzhen, Beijing]
})

print(Datos originales:)
print(df)
print()

# Detectar filas duplicadas (por defecto marca desde la primera, keep='first')
print(Detección de filas duplicadas:)
print(df.duplicated())
print()

# Contar el número de filas duplicadas
print(fNúmero de filas duplicadas: {df.duplicated().sum()})
print()

# Detectar duplicados en una columna específica
print(Detectar duplicados por la columna 'Nombre':)
print(df.duplicated(subset=[Nombre]))

Parámetro keep

Ejemplo

import pandas as pd

df = pd.DataFrame({
    Nombre: [Zhang San, Li Si, Zhang San, Wang Wu, Li Si],
    Edad: [25, 30, 25, 28, 30]
})

print(Datos originales:)
print(df)
print()

# keep='first': conserva la primera aparición (por defecto)
print(keep='first' (por defecto):)
print(df.duplicated(keep="first"))
print()

# keep='last': conserva la última aparición
print("keep='last':")
print(df.duplicated(keep="last"))
print()

# keep=False: marca todos los duplicados (no conserva ninguno)
print(keep=False (marcar todos los duplicados):)
print(df.duplicated(keep=False))

Eliminación de datos duplicados

Uso básico de drop_duplicates

Ejemplo

import pandas as pd

df = pd.DataFrame({
    Nombre: [Zhang San, Li Si, Zhang San, Wang Wu, Li Si],
    Edad: [25, 30, 25, 28, 30],
    Ciudad: [Beijing, Shanghai, Beijing, Guangzhou, Shenzhen]
})

print(Datos originales:)
print(df)
print()

# Eliminar filas duplicadas (por defecto conserva la primera)
print(Eliminar filas duplicadas (conservar la primera):)
print(df.drop_duplicates())
print()

# Conservar la última
print(Eliminar filas duplicadas (conservar la última):)
print(df.drop_duplicates(keep="last"))
print()

# No conservar ninguna fila duplicada
print(Eliminar todas las filas duplicadas:)
print(df.drop_duplicates(keep=False))

Eliminar duplicados por columna

Ejemplo

import pandas as pd

df = pd.DataFrame({
    Nombre: [Zhang San, Li Si, Zhang San, Wang Wu],
    Edad: [25, 30, 35, 28],
    Ciudad: [Beijing, Shanghai, Beijing, Guangzhou]
})

print(Datos originales:)
print(df)
print()

# Eliminar duplicados por una sola columna
print(Eliminar duplicados por la columna 'Nombre':)
print(df.drop_duplicates(subset=[Nombre]))
print()

# Eliminar duplicados por combinación de varias columnas
print(Eliminar duplicados por la combinación 'Nombre' + 'Ciudad':)
print(df.drop_duplicates(subset=[Nombre, Ciudad]))
print()

# Conservar la fila con el mayor valor en una columna específica
print(Agrupar por 'Nombre' y conservar el de mayor edad:)
print(df.sort_values(Edad, ascending=False).drop_duplicates(subset=[Nombre], keep="first"))

Práctica: limpieza de datos

Caso integral

Ejemplo

import pandas as pd
import numpy as np

# Crear datos simulados de pedidos (con duplicados)
orders = pd.DataFrame({
    Número de pedido: ["O001", "O002", "O001", "O003", "O002", "O004"],
    ID del cliente: ["C001", "C002", "C001", "C003", "C002", "C004"],
    Producto: ["iPhone", "MacBook", "iPhone", "iPad", "AirPods", "Apple Watch"],
    Importe: [8000, 12000, 8000, 5000, 1500, 3000],
    Fecha: ["2024-01-01", "2024-01-02", "2024-01-01", "2024-01-03", "2024-01-02", "2024-01-04"]
})

print(Datos originales de pedidos:)
print(orders)
print()

# 1. Detectar pedidos duplicados
print(Detección de pedidos duplicados:)
duplicates = orders[orders.duplicated(subset=[Número de pedido], keep=False)]
print(duplicates)
print()

# 2. Eliminar pedidos completamente duplicados
orders_clean = orders.drop_duplicates()
print(Tras eliminar los completamente duplicados:)
print(fOriginal {len(orders)} filas -> {len(orders_clean)} filas)
print()

# 3. Eliminar duplicados por número de pedido, conservando el más reciente
# Suponer que la última fila es la más reciente
orders_clean = orders.sort_values(Fecha).drop_duplicates(
    subset=[Número de pedido],
    keep="last"
).sort_index()

print(Eliminar duplicados por número de pedido (conservar el más reciente):)
print(orders_clean)

Uso avanzado

Conservar filas específicas por grupo

Ejemplo

import pandas as pd

df = pd.DataFrame({
    Cliente: ["A", "A", "A", "B", "B", "B"],
    Mes: ["01", "02", "03", "01", "02", "03"],
    Consumo: [100, 200, 150, 300, 250, 280]
})

print(Datos originales:)
print(df)
print()

# Conservar el mes de mayor consumo de cada cliente
print(El mes de mayor consumo de cada cliente:)
result = df.sort_values(Consumo, ascending=False).drop_duplicates(
    subset=[Cliente],
    keep="first"
).sort_values(Cliente)
print(result)
print()

# Conservar el primer registro de cada cliente (según el mes)
print(El primer registro de cada cliente:)
result = df.sort_values(Mes).drop_duplicates(
    subset=[Cliente],
    keep="first"
)
print(result)

Marcar duplicados en lugar de eliminarlos

Ejemplo

import pandas as pd

df = pd.DataFrame({
    Nombre: [Zhang San, Li Si, Zhang San, Wang Wu, Li Si],
    Ciudad: [Beijing, Shanghai, Beijing, Guangzhou, Shenzhen]
})

# Añadir una columna de marcado de duplicados
df[Es duplicado] = df.duplicated(subset=[Nombre], keep=False)

print(Marcar filas duplicadas:)
print(df)
print()

# O usar groupby para marcar
df[Número de repeticiones] = df.groupby(Nombre)[Nombre].transform("count")
df[Es primera vez] = ~df.duplicated(subset=[Nombre], keep="first")

print(Conteo de repeticiones por grupo:)
print(df)

Notas importantes

1. Distinguir entre 'duplicados completos' y 'duplicados parciales'

Un duplicado completo significa que todos los valores de las columnas son iguales; un duplicado parcial significa que solo ciertas columnas son iguales. Usa elsubsetparámetro para especificar las columnas que se usan para determinar los duplicados.

2. Selección de la estrategia de conservación

Según los requisitos del negocio, elige conservar la primera fila, la última o ninguna. La elección puede afectar los resultados del análisis posterior.

3. Influencia del tipo de datos

Al detectar duplicados se tiene en cuenta el tipo de datos; por ejemplo, el entero 1 y el flotante 1.0 se consideran diferentes.

Antes de eliminar datos duplicados, se recomienda analizar la causa y la distribución de los duplicados para asegurarse de que la eliminación no pierda información importante.

Otros temas