用每行的初始值替换所有非 NaN 值

Replace all non NaN values with the initial value per row

我有以下数据框:

Periods            0      1      2      3      4      5      6      7     8     9     10    11    12   13   14   15   16   17   18   19
Item 1           89.0   89.0   88.0   86.0   73.0   73.0   67.0    NaN   NaN   NaN   NaN   NaN   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
Item 2          197.0  197.0  157.0  157.0  156.0  156.0  153.0  153.0   3.0   3.0   2.0   NaN   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
Item 3          105.0  105.0   98.0   47.0   40.0   21.0   20.0   15.0  13.0  11.0  11.0  11.0  10.0  7.0  7.0  5.0  5.0  3.0  2.0  1.0

它有几个 NaN,列在 0 - 20 之间。我想要的是将第一列复制到下一列,直到这个值不是 NaN。让我向您展示它应该是什么样子的示例:

Periods                0      1      2      3      4      5      6      7      8      9     10     11     12     13     14     15     16     17     18     19
Item 1               89.0   89.0   89.0   89.0   89.0   89.0   89.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
Item 2               197.0  197.0  197.0  197.0  197.0  197.0  197.0  197.0  197.0  197.0  197.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
Item 3               105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0

但我想不出办法来做到这一点。我希望我可以 post 一些代码,但我尝试的只是搜索这些方法:backfill、ffill。 None 其中看起来像我需要的。

有什么想法吗?提前致谢。

我在这里假设“Periods”是索引

您可以在以 df.notna() 作为掩码的列上使用 mask,并将第一列 (df.iloc[:, 0]) 作为替换值:

df.mask(df.notna(), df.iloc[:, 0], axis=0)

输出:

             0      1      2      3      4      5      6      7      8      9     10     11     12     13     14     15     16     17     18     19
Periods                                                                                                                                            
Item 1    89.0   89.0   89.0   89.0   89.0   89.0   89.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
Item 2   197.0  197.0  197.0  197.0  197.0  197.0  197.0  197.0  197.0  197.0  197.0    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN    NaN
Item 3   105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0  105.0

这是另一个想法,仅供记录:使用 map:

df.iloc[0] = df.iloc[0].notna().map({True: df.iloc[0, 0]})

我会做mul

df.notna().mul(df.iloc[:,0],axis=0).mask(df.isna())