Función Pandas df.drop_duplicates()

Funciones comunes de Pandas


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 (siinplace=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 pandas as pd
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:

  1. En los datos originales, la fila 0 y la fila 2 son completamente idénticas (Zhang San, 25 años, departamento técnico).
  2. La fila 1 y la fila 4 también son completamente idénticas (Li Si, 30 años, departamento de marketing).
  3. Usandodrop_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 pandas as pd
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 pandas as pd
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; usandokeep='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 pandas as pd
    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 akeep=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 pandas as pd
    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 usarignore_indexignore_index, después de eliminar la fila 2, los índices son 0, 1, 3, no consecutivos.
    • Usandoignore_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 pandas as pd
    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:

    1. Los datos originales tienen 6 filas; hay 2 pedidos duplicados (O001 y O002 aparecen dos veces cada uno).
    2. Usandodrop_duplicates(subset=['订单号'])elimina duplicados según el número de pedido.
    3. 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.
    • Usandosubsetel parámetro, solo se determina la duplicación según las columnas especificadas; los valores de otras columnas no afectan el juicio.
    • Usarkeep=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.

    Funciones comunes de Pandas

    Otras extensiones