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

如何在Python中按Date组将Value列缩放到[-3,3]范围?

Python按日期分组缩放数值至[-3,3]区间

核心思路

按Date分组后,对每组的Value列执行min-max缩放,将原数值映射到[-3,3]区间。缩放公式为:

scaled_value = ((value - group_min) / (group_max - group_min)) * 6 - 3

其中6是目标区间的长度(3 - (-3)),减3是将区间从[0,6]平移到[-3,3]。


方法一:自定义函数+groupby.transform(易读性高)

适合大多数场景,代码逻辑清晰,还能处理组内数值全相同的边界情况:

import pandas as pd

def scale_to_range(series):
    group_min = series.min()
    group_max = series.max()
    # 避免组内值全相同导致的除以0错误,返回区间中点0
    if group_max == group_min:
        return pd.Series([0]*len(series), index=series.index)
    return ((series - group_min) / (group_max - group_min)) * 6 - 3

# 对DF按Date分组,缩放Value列并生成新列
DF['Scaled_Value'] = DF.groupby('Date')['Value'].transform(scale_to_range)

方法二:内置方法组合(性能更优,适合超大型数据集)

利用pandas内置的分组统计方法,减少自定义函数的开销,效率更高:

import pandas as pd

# 计算每组的min和max,保持原数据索引对齐
grouped = DF.groupby('Date')['Value']
group_min = grouped.transform('min')
group_max = grouped.transform('max')

# 计算缩放值
DF['Scaled_Value'] = ((DF['Value'] - group_min) / (group_max - group_min)) * 6 - 3

# 处理组内值全相同的情况
DF.loc[group_min == group_max, 'Scaled_Value'] = 0

关键说明

  • transform方法会保留原DataFrame的索引结构,无需额外合并操作,完美适配大型数据集的分组处理需求。
  • 两种方法都处理了组内所有数值相同的边界场景,避免运行时错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:52:44