如何使用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
相关产品推荐
相关产品推荐

