在 Pandas 数据框行中仅保留第一组非 nan 值

Tro*_*mba 4 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   NaN   NaN    2    NaN   NaN    1
Run Code Online (Sandbox Code Playgroud)

我如何只保留第一组非 NaN 值,以便获得如下所示的 Pandas 数据框:

      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
Run Code Online (Sandbox Code Playgroud)

消除 NaN 值之后的任何值。

ALo*_*llz 6

我们可以创建一个面具。有点难解释所以我慢慢来

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
Run Code Online (Sandbox Code Playgroud)

解释

# Row-wise True filling after/including first non-null value.
df.notnull().cummax(1)
       A      B     C     D     E     F
0   True   True  True  True  True  True
1   True   True  True  True  True  True
2   True   True  True  True  True  True
3   True   True  True  True  True  True
4  False   True  True  True  True  True
5  False  False  True  True  True  True

# Adding the `&` condition ensures first True value for each row is after the first 
# non-null group
df.notnull().cummax(1) & df.isnull()
       A      B      C      D      E      F
0  False   True   True   True   True   True
1  False  False  False  False   True  False
2  False  False   True  False  False  False
3  False  False  False  False  False  False
4  False  False  False  False  False  False
5  False  False  False   True   True  False

# We now turn everything to True after the first, row-wise
(df.notnull().cummax(1) & df.isnull()).cummax(1)
       A      B      C      D      E      F
0  False   True   True   True   True   True
1  False  False  False  False   True   True
2  False  False   True   True   True   True
3  False  False  False  False  False  False
4  False  False  False  False  False  False
5  False  False  False   True   True   True
Run Code Online (Sandbox Code Playgroud)