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

如何使用Pandas计算自上一个峰值以来的行数

计算当前行与上一个峰值的滚动行数统计

需求说明

Value | Rows since Peak

1 0
3 0
1 1
2 2
1 3
4 0
6 0
5 1

峰值定义:当前值大于此前所有值的最大值时,视为新峰值,此时行数统计重置为0;非峰值行统计距离上一个峰值的行数(从1开始递增)

实现方案

1. Python Pandas 实现

import pandas as pd

# 构造示例数据
df = pd.DataFrame({'Value': [1, 3, 1, 2, 1, 4, 6, 5]})

# 标记峰值:当前值大于之前的累计最大值
df['is_peak'] = df['Value'] > df['Value'].cummax().shift(fill_value=-float('inf'))

# 按峰值分组,计算组内行数偏移
df['Rows since Peak'] = df.groupby(df['is_peak'].cumsum()).cumcount()

# 输出结果
print(df[['Value', 'Rows since Peak']])

执行后输出:

Value  Rows since Peak
0      1                0
1      3                0
2      1                1
3      2                2
4      1                3
5      4                0
6      6                0
7      5                1

2. SQL 实现(MySQL 8.0+)

WITH ranked_data AS (
    SELECT 
        Value,
        -- 计算截至当前行的累计最大值
        MAX(Value) OVER (ORDER BY ROW_NUMBER() OVER ()) AS running_max,
        -- 标记是否为新峰值
        CASE 
            WHEN Value > LAG(MAX(Value) OVER (ORDER BY ROW_NUMBER() OVER ())) OVER () THEN 1
            ELSE 0
        END AS is_peak
    FROM your_table
),
peak_groups AS (
    SELECT 
        Value,
        -- 累计峰值数量作为分组ID
        SUM(is_peak) OVER (ORDER BY ROW_NUMBER() OVER ()) AS group_id
    FROM ranked_data
)
SELECT 
    Value,
    -- 组内行数偏移(从0开始)
    ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY ROW_NUMBER() OVER ()) - 1 AS `Rows since Peak`
FROM peak_groups;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:45:43