首页 > 解决方案 > 如何在第一个非 nan 值之后将 NaN 填充为 0

问题描述

我需要从第一个非 nan 值开始用 static填充NaNmy的值。df0

在某种程度上,将method="ffill"(识别每列的第一个值,并且只作用于后面的NaN值)与value=0(填充为 0,而不是 df 中的变量)。

我怎样才能做到这一点?这篇文章很接近,但不是:How to replace NaNs by previous or next values in pandas DataFrame?

示例 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')那就太好了。但这又回来了ValueError: Cannot specify both 'value' and 'method'.

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

标签: pythonpandasfillna

解决方案


您可以尝试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

推荐阅读