如何用 0 填充 NaN,从第一个非 nan 值开始
How to populate NaN by 0, starting after first non-nan value
我需要用静态 0
填充我的 df
的 NaN
值,从第一个非 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
我需要用静态 0
填充我的 df
的 NaN
值,从第一个非 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