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

