根据最新的LARGEST值替换数据框中当前值的最快方法

问题描述

我有一个像这样的数据框

     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

我想用该行的最后一个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

当前,我运行一个如下所示的iterrows函数

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

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

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

我计时了,输出了100,000行:

cpu times: user 10.3 s,sys: 4.5 ms,total: 10.3 s
Wall time: 10.4 s

解决方法

使用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