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

Posted

技术标签:

【中文标题】根据最后一个 LARGEST 值替换数据框中当前值的最快方法【英文标题】:Fastest way to replace current value in dataframe based on last LARGEST value 【发布时间】:2020-12-01 08:17:34 【问题描述】:

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

     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

【问题讨论】:

【参考方案1】:

检查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

【讨论】:

以上是关于根据最后一个 LARGEST 值替换数据框中当前值的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

根据规则将数据框中的值替换为其他值

根据熊猫数据框中的最后一个值选择列

SAS 9.4 根据当前值替换当前行之后的所有值

尝试用其他值替换数据框中的值

替换数据框中的所有特定值

替换数据框中的 NaN 索引值