Manejo de valores duplicados en un marco de datos de Pandas

Manejo de valores duplicados en un marco de datos de Pandas

Introducción

Como analista de datos, es nuestra responsabilidad garantizar la integridad de los datos para obtener información precisa y confiable. La limpieza de datos juega un papel vital en este proceso, y los valores duplicados se encuentran entre los problemas más comunes que enfrentan los analistas de datos. Los valores duplicados pueden tergiversar los conocimientos. Por lo tanto, es crucial contar con métodos eficientes para tratar con valores duplicados. En este artículo, aprenderemos cómo identificar y manejar valores duplicados, así como las mejores prácticas para administrar duplicados.

Identificación de valores duplicados

El primer paso para manejar valores duplicados es identificarlos. La identificación de valores duplicados es un paso importante en la limpieza de datos. Pandas ofrece múltiples métodos para identificar valores duplicados dentro de un marco de datos. En esta sección, discutiremos la duplicated() función y value_counts() Función para identificar valores duplicados.

Usin duplicado()

La duplicated() La función es una función de biblioteca de Pandas que busca filas duplicadas en un DataFrame. La salida del duplicated() La función es una serie booleana con la misma longitud que el DataFrame de entrada, donde cada elemento indica si la fila correspondiente es un duplicado o no.

Consideremos un ejemplo simple de la duplicated() función:

import pandas as pd data = { 'StudentName': ['Mark', 'Ali', 'Bob', 'John', 'Johny', 'Mark'], 'Score': [45, 65, 76, 44, 39, 45]
}
df = pd.DataFrame(data) df_duplicates = df.duplicated()
print(df_duplicates)

Salida:

0 False
1 False
2 False
3 False
4 False
5 True
dtype: bool

En el ejemplo anterior, creamos un DataFrame que contiene los nombres de los estudiantes y sus puntajes totales. invocamos duplicated() en el DataFrame, que generó una serie booleana con False representando valores únicos y True representando valores duplicados.

En este ejemplo, la primera aparición del valor se considera única. Sin embargo, ¿qué sucede si queremos que el último valor se considere único y no queremos considerar todas las columnas al identificar valores duplicados? Aquí podemos modificar el duplicated() función modificando los valores de los parámetros.

Parámetros: subconjunto y mantenimiento

La duplicated() La función ofrece opciones de personalización a través de sus parámetros opcionales. Tiene dos parámetros, como se describe a continuación:

  • subset: Este parámetro nos permite especificar el subconjunto de columnas a considerar durante la detección de duplicados. El subconjunto se establece en None por defecto, lo que significa que se considera cada columna en el DataFrame. Para especificar nombres de columnas, podemos proporcionar al subconjunto una lista de nombres de columnas.

    Aquí hay un ejemplo del uso del parámetro de subconjunto:

    
    df_duplicates = df.duplicated(subset=['StudentName'])
    

    Salida:

    0 False
    1 False
    2 False
    3 False
    4 False
    5 True
    dtype: bool
    
  • keep: Esta opción nos permite elegir qué instancia de la fila duplicada debe marcarse como duplicada. Los valores posibles para mantener son:

    • "first": Este es el valor predeterminado para el keep opción. Identifica todos los duplicados excepto la primera aparición, considerando que el primer valor es único.
    • "last": esta opción identifica la última ocurrencia como un valor único. Todas las demás ocurrencias se considerarán duplicados.
    • False: esta opción etiqueta cada instancia como un valor duplicado.

A continuación, se muestra un ejemplo del uso de keep parámetro:


df_duplicates = df.duplicated(keep='last')
print(df_duplicates)

Salida:

0 True
1 False
2 False
3 False
4 False
5 False
dtype: bool
Visualizar valores duplicados

La value_counts() La función es el segundo enfoque para identificar duplicados. El value_counts() La función cuenta el número de veces que aparece cada valor único en una columna. Al aplicar el value_counts() función a una columna específica, se puede visualizar la frecuencia de cada valor.

A continuación, se muestra un ejemplo del uso de value_counts() función:

import matplotlib.pyplot as plt
import pandas as pd data = { 'StudentName': ['Mark', 'Ali', 'Bob', 'John', 'Johny', 'Mark'], 'Score': [45, 65, 76, 44, 39, 45]
}
df = pd.DataFrame(data) name_counts = df['StudentName'].value_counts()
print(name_counts)

Salida:

Mark 2
Ali 1
Bob 1
John 1
Johny 1
Name: StudentName, dtype: int64

Ahora visualicemos valores duplicados con un gráfico de barras. Podemos visualizar efectivamente la frecuencia de valores duplicados usando un gráfico de barras.


name_counts.plot(kind='bar')
plt.xlabel('Student Name')
plt.ylabel('Frequency')
plt.title('Duplicate Name Frequencies')
plt.show()

valores duplicados

Manejo de valores duplicados

Después de identificar valores duplicados, es hora de abordarlos. En esta sección, exploraremos varias estrategias para eliminar y actualizar valores duplicados utilizando los pandas drop_duplicates() y replace() funciones Además, discutiremos la agregación de datos con valores duplicados usando el groupby() función.

Eliminación de valores duplicados

El enfoque más común para manejar duplicados es eliminarlos del DataFrame. Para eliminar registros duplicados del DataFrame, utilizaremos el drop_duplicates() función. De forma predeterminada, esta función conserva la primera instancia de cada fila duplicada y elimina las apariciones posteriores. Identifica valores duplicados basados ​​en todos los valores de columna; sin embargo, podemos especificar la columna a considerar utilizando parámetros de subconjunto.

Sintaxis de drop_duplicates() con valores predeterminados en los parámetros es el siguiente:

dataFrame.drop_duplicates(subset=None, keep='first', inplace=False)

La subset y keep Los parámetros tienen la misma explicación que en duplicates(). Si establecemos el tercer parámetro inplace a True, todas las modificaciones se realizarán directamente en el DataFrame original, lo que dará como resultado que el método regrese None y el DataFrame original siendo modificado. Por defecto, inplace is False.

A continuación se muestra un ejemplo de drop_duplicates() función:


df.drop_duplicates(keep='last', inplace=True)
print(df)

Salida:

 StudentName Score
1 Ali 65
2 Bob 76
3 John 44
4 Johny 39
5 Mark 45

Consulte nuestra guía práctica y práctica para aprender Git, con las mejores prácticas, los estándares aceptados por la industria y la hoja de trucos incluida. Deja de buscar en Google los comandos de Git y, de hecho, aprenden ella!

En el ejemplo anterior, se eliminó la primera entrada porque era un duplicado.

Reemplazar o actualizar valores duplicados

El segundo método para manejar duplicados implica reemplazar el valor usando Pandas replace() función. los replace() La función nos permite reemplazar valores o patrones específicos en un DataFrame con nuevos valores. De forma predeterminada, reemplaza todas las instancias del valor. Sin embargo, al usar el parámetro de límite, podemos restringir el número de reemplazos.

He aquí un ejemplo del uso de la replace() función:


df['StudentName'].replace('Mark', 'Max', limit=1, inplace=True)
print(df)

Salida:

 StudentName Score
0 Max 45
1 Ali 65
2 Bob 76
3 John 44
4 Johny 39
5 Mark 45

Aquí, el límite se usó para reemplazar el primer valor. ¿Qué pasa si queremos reemplazar la última ocurrencia? En este caso, combinaremos el duplicated() y replace() funciones. Utilizando duplicated(), indicaremos la última instancia de cada valor duplicado, obtenga el número de fila usando el loc función, y luego reemplácelo usando el replace() función. He aquí un ejemplo de uso duplicated() y replace() funciones juntas.


last_occurrences = df.duplicated(subset='StudentName', keep='first') last_occurrences_rows = df[last_occurrences] df.loc[last_occurrences, 'StudentName'] = df.loc[last_occurrences, 'StudentName'].replace('Mark', 'Max') print(df)

Salida:

 StudentName Score
0 Mark 45
1 Ali 65
2 Bob 76
3 John 44
4 Johny 39
5 Max 45

Funciones personalizadas para reemplazos complejos

En algunos casos, el manejo de valores duplicados requiere reemplazos más complejos que simplemente eliminarlos o actualizarlos. Las funciones personalizadas nos permiten crear reglas de reemplazo específicas adaptadas a nuestras necesidades. Usando los pandas apply() función, podemos aplicar la función personalizada a nuestros datos.

Por ejemplo, supongamos que la columna "StudentName" contiene nombres duplicados. Nuestro objetivo es reemplazar los duplicados mediante una función personalizada que agrega un número al final de los valores duplicados, haciéndolos únicos.


def add_number(name, counts): if name in counts: counts[name] += 1 return f'{name}_{counts[name]}' else: counts[name] = 0 return name name_counts = {} df['is_duplicate'] = df.duplicated('StudentName', keep=False)
df['StudentName'] = df.apply(lambda x: add_number(x['StudentName'], name_counts) if x['is_duplicate'] else x['StudentName'], axis=1)
df.drop('is_duplicate', axis=1, inplace=True)
print(df)

Salida:

 StudentName Score
0 Mark 45
1 Ali 65
2 Bob 76
3 John 44
4 Johny 39
5 Mark_1 45

Datos agregados con valores duplicados

Los datos que contienen valores duplicados se pueden agregar para resumir y obtener información de los datos. los pandas groupby() La función le permite agregar datos con valores duplicados. Al usar el groupby() función, puede agrupar una o más columnas y calcular la media, la mediana o la suma de otra columna para cada grupo.

He aquí un ejemplo del uso de la groupby() método:


grouped = df.groupby(['StudentName']) df_aggregated = grouped.sum()
print(df_aggregated)

Salida:

 Score
StudentName Ali 65
Bob 76
John 44
Johny 39
Mark 90

Técnicas avanzadas

Para manejar escenarios más complejos y garantizar un análisis preciso, existen algunas técnicas avanzadas que podemos utilizar. Esta sección tratará el manejo de duplicados inexactos, la duplicación en datos de series de tiempo y los valores de índice duplicados.

Duplicados Fuzzy

Los duplicados inexactos son registros que no son coincidencias exactas pero son similares y pueden ocurrir por varias razones, incluidos errores de ingreso de datos, faltas de ortografía y variaciones en el formato. Usaremos el fuzzywuzzy Biblioteca de Python para identificar duplicados mediante coincidencia de similitud de cadenas.

Aquí hay un ejemplo de manejo de valores borrosos:

import pandas as pd
from fuzzywuzzy import fuzz def find_fuzzy_duplicates(dataframe, column, threshold): duplicates = [] for i in range(len(dataframe)): for j in range(i+1, len(dataframe)): similarity = fuzz.ratio(dataframe[column][i], dataframe[column][j]) if similarity >= threshold: duplicates.append(dataframe.iloc[[i, j]]) if duplicates: duplicates_df = pd.concat(duplicates) return duplicates_df else: return pd.DataFrame() data = { 'StudentName': ['Mark', 'Ali', 'Bob', 'John', 'Johny', 'Mark'], 'Score': [45, 65, 76, 44, 39, 45]
}
df = pd.DataFrame(data) threshold = 70 fuzzy_duplicates = find_fuzzy_duplicates(df, 'StudentName', threshold)
print("Fuzzy duplicates:")
print(fuzzy_duplicates.to_string(index=False))

En este ejemplo, creamos una función personalizada. find_fuzzy_duplicates que toma un DataFrame, un nombre de columna y un umbral de similitud como entrada. La función itera a través de cada fila en el DataFrame y la compara con las filas posteriores usando el fuzz.ratio método del fuzzywuzzy biblioteca. Si la puntuación de similitud es mayor o igual que el umbral, las filas duplicadas se agregan a una lista. Finalmente, la función devuelve un DataFrame que contiene los duplicados inexactos.

Salida:

Fuzzy duplicates:
StudentName Score Mark 45 Mark 45 John 44 Johny 39

En el ejemplo anterior, los duplicados inexactos se identifican en la columna "StudentName". La función 'find_fuzzy_duplicates' compara cada par de cadenas usando el fuzzywuzzy de la biblioteca fuzz.ratio función, que calcula una puntuación de similitud basada en la distancia de Levenshtein. Hemos establecido el umbral en 70, lo que significa que cualquier nombre con una relación de coincidencia superior a 70 se considerará un valor confuso. Después de identificar los valores borrosos, podemos administrarlos utilizando el método descrito en la sección titulada "Manejo de duplicados".

Manejo de duplicados de datos de series temporales

Pueden ocurrir duplicados cuando se registran múltiples observaciones en la misma marca de tiempo. Estos valores pueden conducir a resultados sesgados si no se manejan adecuadamente. Aquí hay algunas formas de manejar valores duplicados en datos de series temporales.

  • Descartar duplicados exactos: En este método, eliminamos filas idénticas usando el drop_duplicates función en Pandas.
  • Marcas de tiempo duplicadas con diferentes valores: si tenemos la misma marca de tiempo pero diferentes valores, podemos agregar los datos y obtener más información utilizando groupby(), o podemos seleccionar el valor más reciente y eliminar los demás usando drop_duplicates() con el keep parámetro establecido en 'último'.

Manejo de valores de índice duplicados

Antes de abordar los valores de índice duplicados, primero definamos qué es un índice en Pandas. Un índice es un identificador único asignado a cada fila del DataFrame. Pandas asigna un índice numérico que comienza en cero por defecto. Sin embargo, se puede asignar un índice a cualquier columna o combinación de columnas. Para identificar duplicados en la columna Índice, podemos usar el duplicated() y drop_duplicates() funciones, respectivamente. En esta sección, exploraremos cómo manejar los duplicados en la columna Índice usando reset_index().

Como su nombre lo indica, el reset_index() La función en Pandas se usa para restablecer el índice de un DataFrame. Al aplicar el reset_index() función, el índice actual se descarta automáticamente, lo que significa que los valores del índice inicial se pierden. Al especificar el drop parámetro como False existentes reset_index() función, podemos conservar el valor del índice original mientras restablecemos el índice.

Aquí hay un ejemplo de uso reset_index():

import pandas as pd data = { 'Score': [45, 65, 76, 44, 39, 45]
}
df = pd.DataFrame(data, index=['Mark', 'Ali', 'Bob', 'John', 'Johny', 'Mark']) df.reset_index(inplace=True)
print(df)

Salida:

 index Score
0 Mark 45
1 Ali 65
2 Bob 76
3 John 44
4 Johny 39
5 Mark 45

BUENAS PRÁCTICAS

  • Comprender la naturaleza de los datos duplicados: Antes de tomar cualquier acción, es crucial comprender por qué existen valores duplicados y qué representan. Identifique la causa raíz y luego determine los pasos apropiados para manejarlos.

  • Seleccione un método apropiado para manejar duplicados: Como se discutió en las secciones anteriores, hay varias formas de manejar los duplicados. El método que elija depende de la naturaleza de los datos y del análisis que pretenda realizar.

  • Documentar el enfoque: Es vital documentar el proceso para detectar valores duplicados y abordarlos, permitiendo que otros entiendan el proceso de pensamiento.

  • Precaución de ejercicio: Siempre que eliminemos o modifiquemos datos, debemos asegurarnos de que la eliminación de duplicados no introduzca errores o sesgos en el análisis. Realice pruebas de cordura y valide los resultados de cada acción.

  • Conservar los datos originales: Antes de realizar cualquier operación en los datos, cree una copia de seguridad de los datos originales.

  • Evita futuros duplicados: Implemente medidas para evitar que se produzcan duplicados en el futuro. Esto puede incluir la validación de datos durante la entrada de datos, las rutinas de limpieza de datos o las restricciones de la base de datos para imponer la unicidad.

Consideraciones Finales:

En el análisis de datos, abordar los valores duplicados es un paso crucial. Los valores duplicados pueden conducir a resultados inexactos. Al identificar y administrar valores duplicados de manera eficiente, los analistas de datos pueden obtener información precisa y significativa. La implementación de las técnicas mencionadas y el seguimiento de las mejores prácticas permitirán a los analistas preservar la integridad de sus datos y extraer información valiosa de ellos.

Sello de tiempo:

Mas de Abuso de pila