这是一个基于 numpy 的:
import numpy as np
df = pd.DataFrame([[1, 2, 3, np.nan, np.nan, np.nan], [1, 2, 3, np.nan, np.nan, 2]])
您可以对值数组进行切片,并将其倒序排列,然后查找第一个有效值。然后获取索引,并使用np.put_along_axis 将它们设置为NaNs:
a = df.to_numpy()
m = a.shape[1]-1 - np.argmax(~np.isnan(a[:,::-1]), axis=1)
np.put_along_axis(a, m[:,None], np.nan, axis=1)
df[:] = a
print(df)
0 1 2 3 4 5
0 1.0 2.0 NaN NaN NaN NaN
1 1.0 2.0 3.0 NaN NaN NaN
更多细节-
第一步是找到 NaN 的位置。由于我们想要最后一个有效值,我们应该从最后开始。所以切片得到列颠倒的数组,并使用np.isnan:
np.isnan(a[:,::-1])
array([[ True, True, True, False, False, False],
[False, True, True, False, False, False]])
现在我们可以使用np.argmax找到第一个False,即最后一个有效值:
np.argmax(~np.isnan(a[:,::-1]), axis=1)
# array([3, 0], dtype=int64)
现在通过减去上面的 col 长度,我们得到实际的索引:
a.shape[1]-1 - np.argmax(~np.isnan(a[:,::-1]), axis=1)
# array([2, 5], dtype=int64)
现在我们可以在对应的索引中将这些索引设置为NaN:
np.put_along_axis(a, m[:,None], np.nan, axis=1)