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
相关产品推荐
相关产品推荐

