Python 在超过阈值后,如何循环数据帧中的每一行并将值设置为nan?
如果我有一个像这样的熊猫数据帧:Python 在超过阈值后,如何循环数据帧中的每一行并将值设置为nan?,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,如果我有一个像这样的熊猫数据帧: 0 1 2 3 4 5 A 5 5 10 9 4 5 B 10 10 10 8 1 1 C 8 8 0 9 6 3 D 10 10 11 4 2 9 E 0 9 1 5 8 3 如果我将阈值设置为7,如何循环每一行,并在阈值不再等于np.nan后设置值,以获得如下数据帧: 0 1 2 3 4 5
0 1 2 3 4 5
A 5 5 10 9 4 5
B 10 10 10 8 1 1
C 8 8 0 9 6 3
D 10 10 11 4 2 9
E 0 9 1 5 8 3
如果我将阈值设置为7,如何循环每一行,并在阈值不再等于np.nan后设置值,以获得如下数据帧:
0 1 2 3 4 5
A 5 5 10 9 NaN NaN
B 10 10 10 8 NaN NaN
C 8 8 0 9 NaN NaN
D 10 10 11 4 2 9
E 0 9 1 5 8 NaN
如果最后一个大于7的数字后面的所有内容都被设置为np.nan。一个非常好的问题,颠倒顺序,然后
cumsum
等于0的应该是nan
df.where(df.iloc[:,::-1].gt(7).cumsum(1).ne(0))
0 1 2 3 4 5
A 5 5 10 9 NaN NaN
B 10 10 10 8 NaN NaN
C 8 8 0 9 NaN NaN
D 10 10 11 4 2.0 9.0
E 0 9 1 5 8.0 NaN
使用
df.gt(7)
和bfill
和isna上的df.where
创建掩码m
。最后,使用m
m = df.where(df.gt(7)).bfill(1).notna()
df[m]
Out[24]:
0 1 2 3 4 5
A 5 5 10 9 NaN NaN
B 10 10 10 8 NaN NaN
C 8 8 0 9 NaN NaN
D 10 10 11 4 2.0 9.0
E 0 9 1 5 8.0 NaN
让我们试试这个:
df.where(df.where(df > 7).bfill(axis=1).notna())
输出:
0 1 2 3 4 5
A 5 5 10 9 NaN NaN
B 10 10 10 8 NaN NaN
C 8 8 0 9 NaN NaN
D 10 10 11 4 2.0 9.0
E 0 9 1 5 8.0 NaN
很好,但没有注意到我们能做的事。:-)@ScottBoston:既然你对我的回答感到疑惑,我想给你一个解释。如果您检查我编辑历史记录的时间,您将看到我在您之前发布了bfill
解决方案。刚发完帖子,我就意识到我忽略了这个问题,所以我把它拿下来进行修复。在完成修复和测试并取消删除之前,我不会看到您的解决方案answer@ScottBoston:我们很酷。:)我看到评论消失了,但我想是版主这么删除的,不是你。因此,我想给你一个解释。我也提出了这个,df.where((df>7).iloc[:,:-1].cummax(axis=1))