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