如何用 0 填充 NaN,从第一个非 nan 值开始

How to populate NaN by 0, starting after first non-nan value

我需要用静态 0 填充我的 dfNaN 值,从第一个非 nan 值开始。

在某种程度上,将 method="ffill"(确定每列的第一个值,并且仅对后面的 NaN 值起作用)与 value=0(填充 0,而不是可变数量)相结合在 df).

我该怎么做?这个 post 很接近,但不是:

示例 df

     0    1    2
0  NaN  NaN  NaN
1  6.0  NaN  1.0
2  NaN  3.0  NaN
3  NaN  NaN  4.0

期望的输出:

     0    1    2
0  NaN  NaN  NaN
1  6.0  NaN  1.0
2  0.0  3.0  0.0
3  0.0  0.0  4.0

如果可以的话,df.fillna(value=0, method='ffill')就好了。但是那个returnsValueError: Cannot specify both 'value' and 'method'.

编辑:哦,时间很重要。我们正在谈论 ~60M 行和 4k 列 - 所以循环是不可能的,并且只有在非常非常快的情况下才进行屏蔽

您可以尝试 mask()ffill()fillna():

df=df.fillna(df.mask(df.ffill().notna(),0))
#OR via where
df=df.fillna(df.where(df.ffill().isna(),0))

输出:

    0       1       2
0   NaN     NaN     NaN
1   6.0     NaN     1.0
2   0.0     3.0     4.0
3   0.0     0.0     0.0