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.

Pandas fillna() rellena las filas en un orden específico.

Tengo un problema con el método fillna(). Este es mi ejemplo de dataframe, que representa la cantidad de artículos en una tienda. Me gustaría llenar todos los NaN. Si hay un NaN, me gustaría llenarlo con valores del día anterior o, si también es NaN, entonces del día siguiente (mismo producto, misma tienda). Si todos los días para un producto y una tienda específicos son NaNs, entonces me gustaría llenarlo con 0. Estoy buscando la mejor manera en pandas para hacerlo, tenía algunas ideas con bucles, pero no se ve muy bien.

Mi dataframe:

day shop product quantity
0 1 shop_A apples 3.0
1 2 shop_A apples NaN
2 3 shop_A apples 1.0
3 1 shop_A bananas NaN
4 2 shop_A bananas NaN
5 3 shop_A bananas NaN
6 1 shop_B apples NaN
7 2 shop_B apples NaN
8 3 shop_B apples 2.0
9 1 shop_B bananas NaN
10 2 shop_B bananas 4.0
11 3 shop_B bananas 2.0

Dataframe esperado:

day shop product quantity
0 1 shop_A apples 3.0
1 2 shop_A apples 3.0
2 3 shop_A apples 1.0
3 1 shop_A bananas 0.0
4 2 shop_A bananas 0.0
5 3 shop_A bananas 0.0
6 1 shop_B apples 2.0
7 2 shop_B apples 2.0
8 3 shop_B apples 2.0
9 1 shop_B bananas 4.0
10 2 shop_B bananas 4.0
11 3 shop_B bananas 2.0

También intenté fillna(limit=3), pero eso no es lo que estoy buscando.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el df esperado, puedes utilizar el método fillna con groupby y ffill/bfill.

    Aquí tienes un fragmento de código que debería funcionar:

    # reemplazar NaN con el valor anterior/siguiente dentro de cada grupo
    df['quantity'] = df.groupby(['shop', 'product'])['quantity'].fillna(method='ffill').fillna(method='bfill')
    
    # completar los NaN restantes con 0
    df['quantity'].fillna(0, inplace=True)
    

    La primera línea completa los valores NaN propagando los valores no nulos hacia adelante (ffill) y hacia atrás (bfill) dentro de cada grupo definido por la tienda y el producto.

    La segunda línea completa cualquier NaN restante con 0.

    Al ejecutar este código en el df proporcionado, se producirá el resultado esperado.

Comments are closed.