慕姐4208626
这是一个基于 numpy 的:import numpy as npdf = 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[:] = aprint(df) 0 1 2 3 4 50 1.0 2.0 NaN NaN NaN NaN1 1.0 2.0 3.0 NaN NaN NaN更多细节 -第一步是找到 NaN 的位置。因为我们想要最后一个有效值,所以我们应该从最后开始。所以 slice 得到列颠倒的数组,并使用np.isnan:np.isnan(a[:,::-1])array([[ True, True, True, False, False, False], [False, True, True, False, False, False]])现在我们可以找到第一个False,即最后一个有效值,使用np.argmax: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)
开满天机
枚举列并检查循环中的值是否为 NaN:import pandas as pdimport numpy as npdf = pd.DataFrame([[1, 2, 3, np.NaN, np.NaN, 2]], columns=["a", "b", "c", "d", "e", "f"])j = 0for idx, c in enumerate(df.columns): if df[c].isna().any(): while df.iloc[:, idx - j].isna().any(): j += 1 df.iloc[:, idx - j] = np.nanprint(df)退货: a b c d e f0 1 NaN NaN NaN NaN 2编辑:插入了太多的 NaN。将尝试修复它,否则删除答案..