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))