用每行的初始值替换所有非 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())
我有以下数据框:
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())