pandas 填充的设置值

Aes*_*sir 5 python pandas

我想要与 pandas dataframe.fillna('ffill') 方法完全相同的行为,但我不想使用最后一个非 NaN 值,而是想自己选择该值,例如

[NaN, NaN, NaN, 1, 2, 3, 4, 5, NaN, NaN, NaN]

应该成为

[NaN, NaN, NaN, 1, 2, 3, 4, 5, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)

使用方法调用 df.fillnan(0, 'ffill')。

我可以通过迭代数据帧每行中的每个值来实现此目的,但想知道是否有更优化的方法?

jez*_*ael 3

用于Series.where过滤正向填充后的非缺失值:

s = pd.Series([np.NaN, np.NaN, np.NaN, 1, 2, np.NaN, 4, 5, np.NaN, np.NaN, np.NaN])
print (s)
0     NaN
1     NaN
2     NaN
3     1.0
4     2.0
5     NaN
6     4.0
7     5.0
8     NaN
9     NaN
10    NaN
dtype: float64

s = s.where(s.ffill().isnull(), s.fillna(0))
print (s)
0     NaN
1     NaN
2     NaN
3     1.0
4     2.0
5     0.0
6     4.0
7     5.0
8     0.0
9     0.0
10    0.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)

按行工作的解决方案:

df = pd.DataFrame({
         'B':[np.nan,np.nan,4,np.nan,5,np.nan],
         'C':[7,8,9,4,np.nan,np.nan],
         'D':[np.nan,np.nan,np.nan,np.nan,1,np.nan],
         'E':[np.nan] * 6,

})

df1 = df.where(df.ffill(axis=1).isnull(), df.fillna(0)) 
print (df1)
     B    C    D    E
0  NaN  7.0  0.0  0.0
1  NaN  8.0  0.0  0.0
2  4.0  9.0  0.0  0.0
3  NaN  4.0  0.0  0.0
4  5.0  0.0  1.0  0.0
5  NaN  NaN  NaN  NaN
Run Code Online (Sandbox Code Playgroud)

通过检查非缺失值创建的布尔掩码的另一个解决方案,cumsum并通过以下方式进行比较DataFrame.eq

df1 = df.where(df.notnull().cumsum(axis=1).eq(0), df.fillna(0))
print (df1)
     B    C    D    E
0  NaN  7.0  0.0  0.0
1  NaN  8.0  0.0  0.0
2  4.0  9.0  0.0  0.0
3  NaN  4.0  0.0  0.0
4  5.0  0.0  1.0  0.0
5  NaN  NaN  NaN  NaN
Run Code Online (Sandbox Code Playgroud)

  • @Aesir - 现在明白了,它就像`df.where(df.fillna(axis=1, method='ffill').isnull(), df.fillna(0))` (2认同)
  • 确切地!谢谢 (2认同)