如果我有一个像这样的熊猫数据框:
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 值之后的任何值。
我们可以创建一个面具。有点难解释所以我慢慢来
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)