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.
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 depagePath
ySessionId
. 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:Este código crea dos nuevas columnas con el valor anterior de
pagePath
ySessionId
utilizando el métodoshift()
. 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.