You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pandas判断DataFrame中price列当前值是否大于过去10行的所有值

判断当前值是否大于过去10行所有值的解决方案

嘿,这个需求用pandas的rolling窗口函数就能轻松搞定,比手动循环shift高效太多啦!下面直接上实操步骤:

核心思路

我们需要为每一行计算当前行之前10行的最大值,然后把当前price和这个最大值做比较:如果当前值更大,就标记为1.0,否则用NaN填充(匹配你给出的期望输出)。

代码实现

1. 构造示例数据

先还原你给出的输入DataFrame:

import pandas as pd

data = {
    'price': [3.337, 3.320, 3.290, 3.291, 3.312, 3.255, 3.216, 3.245, 3.275, 3.282,
              3.370, 3.396, 3.375, 3.369, 3.335, 3.344, 3.365, 3.373, 3.414, 3.378]
}
df = pd.DataFrame(data, index=range(220, 240))

2. 计算isGreater列

方法一:适合pandas 1.2.0+版本(推荐)

用rolling的closed='left'参数,直接指定窗口只包含当前行之前的10行:

# 计算过去10行的最大值(不包含当前行)
rolling_max = df['price'].rolling(window=10, closed='left').max()
# 比较当前price是否大于窗口最大值,转换为1.0/NaN
df['isGreater'] = (df['price'] > rolling_max).map({True: 1.0, False: pd.NA})

方法二:兼容旧版本pandas

如果你的pandas版本不支持closed参数,可以先把数据下移一行,再取窗口最大值:

# 先将price列下移一行,这样rolling(10)就对应过去10行
shifted_rolling_max = df['price'].shift(1).rolling(window=10).max()
df['isGreater'] = (df['price'] > shifted_rolling_max).map({True: 1.0, False: pd.NA})

输出结果

运行后得到的DataFrame和你的期望完全一致:

price isGreater
220  3.337        NaN
221  3.320        NaN
222  3.290        NaN
223  3.291        NaN
224  3.312        NaN
225  3.255        NaN
226  3.216        NaN
227  3.245        NaN
228  3.275        NaN
229  3.282        NaN
230  3.370        1.0
231  3.396        1.0
232  3.375        NaN
233  3.369        NaN
234  3.335        NaN
235  3.344        NaN
236  3.365        NaN
237  3.373        NaN
238  3.414        1.0
239  3.378        NaN

补充说明

  • rolling(window=10)会为每个位置生成一个长度为10的滑动窗口,前9行因为凑不够10个历史数据,所以最大值是NaN,对应isGreater也是NaN,符合你的需求。
  • 用map或者apply转换布尔值为1.0/NaN,是为了和你给出的期望输出格式匹配,如果你需要用True/False或者1/0,直接去掉转换步骤即可。

内容的提问来源于stack exchange,提问作者Max4467

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 17:07:29