【问题标题】:how to use previous N values in column in if statement如何在if语句的列中使用前N个值
【发布时间】:2026-01-15 06:10:01
【问题描述】:

我有一个数据框df

df=pd.DataFrame([[47,55,47,50,200], [33,37,30,25,100],[61,65,54,57,300],[25,26,21,22,400], [25,29,23,28,410],[28,34,32,30,430],[32,31,30,28,1000]], columns=['open','high','low','close','volume'])
print(df)

  open high low close volume
0   47  55  47  50  200
1   33  37  30  25  100
2   61  65  54  57  300
3   25  26  21  22  400
4   25  29  23  28  410
5   28  34  32  30  430
6   32  31  30  28  1000

我想使用公式将体积列中的异常值替换为75th percentile

if df['volume'] > (3IQR + vol_q3):

3IQR 是体积列的IQR*3

而 vol_q3 是体积的 最后 N 个值的第 75 个百分位(在本例中为最后 4 个值)。

我写的代码如下:

from collections import deque
import pandas as pd
import numpy as np

vol_q=deque()

q1 = df['volume'].quantile(0.25)
q3 = df['volume'].quantile(0.75)
iqr_3 = 3*(q3 - q1)

for idx, rows in df.iterrows():
    if idx < 5:
        vol_q.append(rows['volume'])
    else :
        vol_q.popleft()
        vol_q.append(rows['volume'])

    vol_q3 = np.percentile(list(vol_q), 75)

    if rows['volume'] > (iqr_3 + vol_q3):
        rows['volume'] = q3

输出:

    open high low close volume
0   47  55  47  50  200
1   33  37  30  25  100
2   61  65  54  57  300
3   25  26  21  22  400
4   25  29  23  28  410
5   28  34  32  30  430
6   32  31  30  28  420

它正在工作,但对于我拥有的数据量来说太慢了。有没有其他方法可以更快地实现它? 如何通过 apply 使用之前的 N 个值

欢迎提出任何建议。 谢谢

【问题讨论】:

  • 是否可以为相同的输入添加预期的输出
  • 添加了与预期相同的输出。

标签: python pandas numpy outliers


【解决方案1】:
v = df.volume # other columns not relevant to question
q = v.rolling(4).quantile(0.75) # 75th percentile of last 4
r = v.where(v <= iqr_3 + q, q3)

q 是矢量化滚动分位数,计算速度快,无需循环。 r 是结果,这有点难以从您的问题中验证,因为您的示例数据似乎不包含足以触发条件的极端值,但我认为您明白了这个想法。

【讨论】:

  • 这就是我要找的。谢谢。