Comparación eficiente de filas en un dataframe de pandas con datos incompletos.
Trabajo con datos incompletos que también tienen duplicados y necesito eliminar los duplicados, eligiendo las filas completas si están disponibles.
Por ejemplo: así es como se ven los datos.
Necesito buscar en cada fila para ver si es un duplicado (tiene un ‘rank’ > 1), y si es incompleta pero tiene algunos duplicados completos.
Explicaré ahora:
– No todas las filas con ‘rank’ = 1 tienen una fecha (es crucial),
pero algunas de ellas tienen duplicados (‘rank’ > 1) que tienen una fecha.
– No todas las filas tienen un duplicado. Y si no tiene una fecha, está bien.
Entonces, necesito encontrar el duplicado con la fecha si existe, y reescribirlo en la fila con el rango 1 (o eliminar una primera fila incompleta).
Al final, necesito tener un DataFrame sin duplicados y con todas las fechas disponibles.
Aquí está mi código con un bucle iterativo EXTREMADAMENTE ineficiente, pero no sé cómo reescribirlo con vectorización o el método .apply():
def test_func(dataframe):
df = dataframe
df.iloc[0:0]
for i in range(0, dataframe.shape[0]):
if dataframe.iloc[i]['rank'] == 1:
temp_row = dataframe.iloc[i]
elif ((dataframe.iloc[i+1]['rank']>1) and
(pd.isna(dataframe.iloc[i]['date'])
and(~pd.isna(dataframe.iloc[i+1]['date'])))):
temp_row = dataframe.iloc[i+1]
df.loc[i] = temp_row
return df
¡Espero encontrar ayuda! Desde Rusia con amor xo.
davy.ai
Para evitar el bucle iterativo ineficiente, puedes intentar usar las funciones integradas de pandas para manipular los datos. Aquí hay una forma de abordar el problema:
drop_duplicates
para eliminar filas duplicadas exactas basadas en las columnas que elijas (en este caso, ‘rank’ y ‘date’).ffill
para completar cualquier valor faltante en la columna ‘date’ con el valor no nulo anterior para cada grupo ‘rank’.dropna
para eliminar cualquier fila en la que la columna ‘date’ sea nula.Aquí hay un ejemplo de código que debería hacer lo que necesitas:
Ten en cuenta que esta función devuelve un nuevo dataframe limpio y no modifica el dataframe original pasado como argumento. Puedes llamar a esta función con tu muestra de dataframe de la siguiente manera:
¡Espero que esto te ayude!