基于最后一个 LARGEST 值替换数据框中当前值的最快方法

Tom*_*m G 3 python optimization loops numpy pandas

说我有一个看起来像这样的数据框

     A
0   17
1   21
2   18
3   11
4    4
5   27
6   21
7   11
8    7
9    4
10   7
11   4
12   3
13  27
14  27
15  11
16  11
17  25

Run Code Online (Sandbox Code Playgroud)

我想用该行中的最后一个 LARGEST 值替换下一行的值。所需的输出是这样的:

     A   B
0   17  17
1   21  21
2   18   0
3   11   0
4    4   0
5   27  27
6   21   0
7   11   0
8    7   0
9    4   0
10   7   0
11   4   0
12   3   0
13  27  27
14  27  27
15  11   0
16  11   0
17  25   0
Run Code Online (Sandbox Code Playgroud)

目前我运行一个 iterrows 函数,如下所示:

df['B'] = df['A']

lastrow = -1
for i, row in df.iterrows():
  if lastrow > row['B']:
      row['B'] = 0
  else: 
    lastrow = row['B']
Run Code Online (Sandbox Code Playgroud)

但它很慢。有没有办法提高这个循环的速度?

我计时,对于 100,000 行,这是输出:

CPU times: user 10.3 s, sys: 4.5 ms, total: 10.3 s
Wall time: 10.4 s
Run Code Online (Sandbox Code Playgroud)

WeN*_*Ben 8

检查 cummax

df['B']=df.A.where(df.A.eq(df.A.cummax()),0)
df
Out[75]: 
     A   B
0   17  17
1   21  21
2   18   0
3   11   0
4    4   0
5   27  27
6   21   0
7   11   0
8    7   0
9    4   0
10   7   0
11   4   0
12   3   0
13  27  27
14  27  27
15  11   0
16  11   0
17  25   0
Run Code Online (Sandbox Code Playgroud)