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

Python或MySQL实现DataFrame未来12个月最大值列生成,不足4月补0

实现方案

Pandas 实现

你原有代码的核心问题是没有在每次循环时重置最大值缓存、未判断剩余数据行数阈值,也没有限制12个月的查询窗口,导致历史最大值一直被保留且不会触发0值填充逻辑。

首先请确保你的DataFrame已经按月份升序排序并重置索引,再使用以下代码实现:

import pandas as pd

# 请替换为你实际的月份列名,先做排序保证时间顺序正确
df_uid = df_uid.sort_values('month_col', ascending=True).reset_index(drop=True)
total_rows = len(df_uid)
max_values = []
look_back_window = 12 # 统计之后12个月的最大值
min_remaining_rows = 4 # 剩余不足4个月时填充0

for current_idx in range(total_rows):
    # 计算当前行之后剩余的有效数据行数(从下一个月开始算)
    remaining = total_rows - current_idx - 1
    if remaining < min_remaining_rows:
        max_values.append(0)
        continue
    # 定义查询范围:下一行到当前行+13行(左闭右开,刚好取12个月),不超过总行数
    end_pos = min(current_idx + 1 + look_back_window, total_rows)
    current_max = df_uid['DPD_BCK'].iloc[current_idx+1 : end_pos].max()
    max_values.append(current_max)

df_uid['Max Value'] = max_values

MySQL 实现

MySQL 8.0及以上版本可以直接用窗口函数实现,要求表内有可排序的月份字段(日期类型或可按时间顺序排序的字符串类型均可):

SELECT 
    *,
    CASE
        -- 先判断当前行之后的剩余数据条数是否不足4
        WHEN COUNT(*) OVER (ORDER BY month_col ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING) < 4 THEN 0
        -- 符合条件则取之后12个月的value最大值
        ELSE MAX(value) OVER (ORDER BY month_col ROWS BETWEEN 1 FOLLOWING AND 12 FOLLOWING)
    END AS `Max Value`
FROM 你的表名
ORDER BY month_col;

如果是MySQL 5.x版本不支持窗口函数,可以用子查询关联实现:

SELECT 
    t1.*,
    CASE
        WHEN (SELECT COUNT(*) FROM 你的表名 t2 WHERE t2.month_col > t1.month_col) < 4 THEN 0
        ELSE (
            SELECT MAX(t3.value) FROM 你的表名 t3 
            WHERE t3.month_col > t1.month_col 
            ORDER BY t3.month_col LIMIT 12
        )
    END AS `Max Value`
FROM 你的表名 t1
ORDER BY t1.month_col;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:24:02