如何将nan替换为跨行但仅在值之间的某个值

  • 本文关键字:之间 nan 替换 python pandas
  • 更新时间 :
  • 英文 :


我有下面的数据框,我想用一个特定的值替换nan,比如说,0.0001,只有在缺失值的右边有一个值。

ID 2021_12        2021_09     2021_06    2021_03      2020_12     2020_09
A 0.020637713       nan         nan         nan         nan         nan
B 0.020637717   0.020637717 0.020637717 0.020637717     nan     0.007053725
C 0.020637723   0.020637723 0.020637723 0.020637723 0.020637723 0.020637723
D 0.020637729       nan         nan         nan         nan         nan
E 0.020637733   0.02504525  0.02504525      nan         nan         nan     
F 0.020637735   0.020637735 0.020637735     nan         nan         nan 
G 0.020637735       nan         nan     0.017617495     nan         nan

所需输出

ID 2021_12        2021_09     2021_06    2021_03      2020_12     2020_09
A 0.020637713       nan         nan         nan         nan         nan
B 0.020637717   0.020637717 0.020637717 0.020637717    0.0001   0.007053725
C 0.020637723   0.020637723 0.020637723 0.020637723 0.020637723 0.020637723
D 0.020637729       nan         nan         nan         nan         nan
E 0.020637733   0.02504525  0.02504525      nan         nan         nan     
F 0.020637735   0.020637735 0.020637735     nan         nan         nan 
G 0.020637735      0.0001      0.0001   0.017617495     nan         nan

使用DataFrame.mask与掩码对测试不缺失的值进行反向填充后的缺失值链接:

#if misisng values are strings
df = df.replace('nan', np.nan)
df = df.mask(df.bfill(axis=1).notna() & df.isna(), 0.001)
print (df)
ID   2021_12   2021_09   2021_06   2021_03   2020_12   2020_09
0  A  0.020638       NaN       NaN       NaN       NaN       NaN
1  B  0.020638  0.020638  0.020638  0.020638  0.001000  0.007054
2  C  0.020638  0.020638  0.020638  0.020638  0.020638  0.020638
3  D  0.020638       NaN       NaN       NaN       NaN       NaN
4  E  0.020638  0.025045  0.025045       NaN       NaN       NaN
5  F  0.020638  0.020638  0.020638       NaN       NaN       NaN
6  G  0.020638  0.001000  0.001000  0.017617       NaN       NaN

提高性能的解决方案-测试不缺失的值,用累积和交换列的顺序,如果值大于0,在numpy中最后交换到原始顺序:

#if missing values are strings
df = df.replace('nan', np.nan)
m = df.notna()
m1 = (np.cumsum(m.to_numpy()[:, ::-1], axis=1) > 0)[:, ::-1]
df = df.mask(m1 & ~m, 0.001)
print (df)
ID   2021_12   2021_09   2021_06   2021_03   2020_12   2020_09
0  A  0.020638       NaN       NaN       NaN       NaN       NaN
1  B  0.020638  0.020638  0.020638  0.020638  0.001000  0.007054
2  C  0.020638  0.020638  0.020638  0.020638  0.020638  0.020638
3  D  0.020638       NaN       NaN       NaN       NaN       NaN
4  E  0.020638  0.025045  0.025045       NaN       NaN       NaN
5  F  0.020638  0.020638  0.020638       NaN       NaN       NaN
6  G  0.020638  0.001000  0.001000  0.017617       NaN       NaN

最新更新