Fastest way to replace current value in dataframe based on last LARGEST value

Viewed 63

say i have a dataframe that looks like this

     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

I'd like to replace the next row's value with the last LARGEST value in that row. the desired output is this:

     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

Currently I run a iterrows function that looks like this:

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

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

But it's quite slow. Is there a way to improve the speed of this loop?

i timed it and for 100,000 rows this is the output:

CPU times: user 10.3 s, sys: 4.5 ms, total: 10.3 s
Wall time: 10.4 s
1 Answers

Check with 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
Related