es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminar filas repetidas en un DataFrame basándose en una condición en pandas.

Estoy intentando eliminar filas repetidas en un marco de datos basado en la siguiente condición:
Si el valor de la columna pagePath es igual que en la fila anterior y el SessionId es el mismo, necesito eliminar esta fila. Si el SessionId es diferente, entonces el pagePath repetido no debería ser eliminado. Esto es lo que he intentado:

data = data.sort_values(['SessionId', 'Datum'], ascending=True, ignore_index=True)
i = 0
for i, _ in data.iterrows():  # i = índice, _ = fila
    if i != 0:
        try:
            while data.SessionId[i] == data.SessionId[i - 1] and data.pagePath[i] == data.pagePath[i - 1]:
                data = data.drop(i - 1)
                data = data.reset_index(drop=True)
        except KeyError:
            continue

Como puedes ver, estoy obteniendo la excepción KeyError, aunque no creo que sea malo ya que el código hace lo que debería con el marco de datos de 1000 filas. El único problema es que no funciona con un conjunto de datos más grande de 6,5 millones de filas. O bien nunca termina o recibo un SIGKILL. Soy consciente de que no debería usar un bucle for para conjuntos de datos, pero no pude encontrar una mejor solución y estaría agradecido si pudieras ayudarme a mejorar mi código.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para evitar la excepción KeyError y mejorar el rendimiento, puedes utilizar el método shift() de pandas para crear una nueva columna con el valor anterior de pagePath y SessionId. Luego, puedes utilizar el operador booleano & para verificar si ambas columnas son iguales en la fila actual y la fila anterior. Finalmente, puedes utilizar la indexación booleana para filtrar las filas que cumplen la condición:

    data['previous_pagePath'] = data['pagePath'].shift(1)
    data['previous_SessionId'] = data['SessionId'].shift(1)
    
    condition = (data['previous_pagePath'] == data['pagePath']) & \
                (data['previous_SessionId'] == data['SessionId'])
    
    data = data.loc[~condition]
    

    Este código crea dos nuevas columnas con el valor anterior de pagePath y SessionId utilizando el método shift(). Luego, crea una condición booleana para verificar si ambas columnas son iguales en la fila actual y la fila anterior utilizando el operador booleano &. Finalmente, utiliza la indexación booleana ~condition para filtrar las filas que no cumplen la condición, eliminando efectivamente las filas repetidas.

    Este enfoque debería mejorar el rendimiento en comparación con el uso de un bucle for, especialmente con conjuntos de datos grandes.

Comments are closed.