Cómo hacer un relleno con valores cero hasta que aparezcan datos en cada columna, luego use el relleno hacia adelante para cada columna en el marco de datos de pandas

Tengo el siguiente marco de datos,

date          x1     x2     x3  
2001-01-01   nan    0.4    0.1 
2001-01-02   nan    0.3    nan
2021-01-03   nan    nan    0.5
...
2001-05-05   nan    0.1    0.2
2001-05-06   0.1    nan    0.3
...

Entonces, primero quiero llenar todos los valores nan con cero hasta que aparezca el primer punto de datos en cada columna, después de eso, quiero que el resto de las filas usen la función fowardfill.

Entonces, el marco de datos anterior debería verse así,

date          x1     x2     x3  
2001-01-01     0    0.4    0.1 
2001-01-02     0    0.3    0.1
2021-01-03     0    0.3    0.5

...
2001-05-05     0    0.1    0.2
2001-05-06   0.1    0.1    0.3
...

Si hago fillna con 0 primero, luego hago forwardfill, así,

df = df.fillna(0)
df = df.ffill()

Solo obtengo que todos los valores de na sean cero, y no puedo completar las partes donde comienzan los datos.

¿Hay alguna manera de hacer el relleno de la manera que quiero?

Answer

Invierta la lógica:

out = df.ffill().fillna(0)
print(out)

# Output
         date   x1   x2   x3
0  2001-01-01  0.0  0.4  0.1
1  2001-01-02  0.0  0.3  0.1
2  2021-01-03  0.0  0.3  0.5
3  2001-05-05  0.0  0.1  0.2
4  2001-05-06  0.1  0.1  0.3