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.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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:

    1. Ordena el dataframe basado en las columnas ‘rank’ y ‘date’, en orden ascendente.
    2. Usa el método drop_duplicates para eliminar filas duplicadas exactas basadas en las columnas que elijas (en este caso, ‘rank’ y ‘date’).
    3. Usa el método ffill para completar cualquier valor faltante en la columna ‘date’ con el valor no nulo anterior para cada grupo ‘rank’.
    4. Usa el método 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:

    import pandas as pd
    
    def clean_data(dataframe):
        # ordena el dataframe por rank y date
        df = dataframe.sort_values(by=['rank', 'date'])
    
        # elimina duplicados exactos basados en las columnas rank y date
        df = df.drop_duplicates(subset=['rank', 'date'])
    
        # completa las fechas faltantes con los valores no nulos anteriores para cada grupo de rank
        df['date'] = df.groupby('rank')['date'].ffill()
    
        # elimina cualquier fila restante con fechas nulas
        df = df.dropna(subset=['date'])
    
        return df
    

    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:

    df = pd.read_csv('tu_archivo_de_datos.csv')
    cleaned_df = clean_data(df)
    

    ¡Espero que esto te ayude!

Comments are closed.