Python 3.x 在数据帧行中仅保留第一组非nan值

Python 3.x 在数据帧行中仅保留第一组非nan值,python-3.x,pandas,Python 3.x,Pandas,如果我有一个像这样的熊猫数据框: A B C D E F 0 1 NaN NaN NaN NaN NaN 1 2 5 6 1 NaN 1 2 2 3 NaN 1 4 1 3 5 5 2 1 2 1 4 NaN 2 3 4 1 2 5

如果我有一个像这样的熊猫数据框:

      A     B     C     D     E     F
 0    1    NaN   NaN   NaN   NaN   NaN
 1    2     5     6     1    NaN    1
 2    2     3    NaN    1     4     1
 3    5     5     2     1     2     1
 4   NaN    2     3     4     1     2
 5   NaN   NaN    2    NaN   NaN    1
      A     B     C     D     E     F
 0    1    NaN   NaN   NaN   NaN   NaN
 1    2     5     6     1    NaN   NaN
 2    2     3    NaN   NaN   NaN   NaN
 3    5     5     2     1     2     1
 4   NaN    2     3     4     1     2
 5   NaN   NaN    2    NaN   NaN   NaN
如何仅保留第一组非NaN值,以便获得如下数据帧:

      A     B     C     D     E     F
 0    1    NaN   NaN   NaN   NaN   NaN
 1    2     5     6     1    NaN    1
 2    2     3    NaN    1     4     1
 3    5     5     2     1     2     1
 4   NaN    2     3     4     1     2
 5   NaN   NaN    2    NaN   NaN    1
      A     B     C     D     E     F
 0    1    NaN   NaN   NaN   NaN   NaN
 1    2     5     6     1    NaN   NaN
 2    2     3    NaN   NaN   NaN   NaN
 3    5     5     2     1     2     1
 4   NaN    2     3     4     1     2
 5   NaN   NaN    2    NaN   NaN   NaN

消除NaN值之后的任何值

我们可以创建一个遮罩。这有点难以解释,所以我会慢慢解释

m = (df.notnull().cummax(1) & df.isnull()).cummax(1)
df.mask(m)
     A    B    C    D    E    F
0  1.0  NaN  NaN  NaN  NaN  NaN
1  2.0  5.0  6.0  1.0  NaN  NaN
2  2.0  3.0  NaN  NaN  NaN  NaN
3  5.0  5.0  2.0  1.0  2.0  1.0
4  NaN  2.0  3.0  4.0  1.0  2.0
5  NaN  NaN  2.0  NaN  NaN  NaN

解释
与Alollz的逻辑不同,使用
cumsum
mask
,第一个mask是控制前导的
NaN
,其中是将False屏蔽为NaN

s=df.isna().cumsum(1).mask(df.isna()).bfill(1)
df.where(s.eq(s.min(1),axis=0))
     A    B    C    D    E    F
0  1.0  NaN  NaN  NaN  NaN  NaN
1  2.0  5.0  6.0  1.0  NaN  NaN
2  2.0  3.0  NaN  NaN  NaN  NaN
3  5.0  5.0  2.0  1.0  2.0  1.0
4  NaN  2.0  3.0  4.0  1.0  2.0
5  NaN  NaN  2.0  NaN  NaN  NaN

我跟不上名字的变化(-:@piRSquared哈哈,先生,这将是最后一次~呸,这个问题让我头疼。回答得好:D