Python实现带自定义上下限的DataFrame数据0-1缩放打分方法
实现自定义区间0-1映射的方法
你需要的效果可以通过自定义函数快速实现,不需要依赖额外的封装工具,逻辑清晰可控,还能自动处理超出上下限的数值截断:
核心逻辑说明
- 第一组规则(20/0,逆向映射):数值越小得分越高,取值小于等于0时得1分,大于等于20时得0分,区间内得分公式:
(20 - 数值) / (20 - 0) - 第二组规则(0/30,正向映射):数值越大得分越高,取值小于等于0时得0分,大于等于30时得1分,区间内得分公式:
(数值 - 0) / (30 - 0) - 所有超出范围的得分会自动截断到[0,1]区间,避免出现负数或大于1的异常值
代码实现
import pandas as pd import numpy as np # 通用自定义映射函数 def custom_scale(x, range_min, range_max, reverse=False): # 先把输入值截断到自定义区间范围内 x_clipped = np.clip(x, range_min, range_max) # 计算区间长度 range_len = range_max - range_min if reverse: # 逆向映射:值越小得分越高 score = (range_max - x_clipped) / range_len else: # 正向映射:值越大得分越高 score = (x_clipped - range_min) / range_len return score # 示例数据和你提供的参考一致 df = pd.DataFrame({ 'values': [-5.1, 3.6, 6.6, 9.0, 21.0] }) # 应用两组规则,保留2位小数 df['score(20/0)'] = df['values'].apply(lambda x: custom_scale(x, 0, 20, reverse=True)).round(2) df['score(0/30)'] = df['values'].apply(lambda x: custom_scale(x, 0, 30, reverse=False)).round(2) print(df)
输出结果
运行后输出和你给出的参考完全匹配:
values score(20/0) score(0/30) 0 -5.1 1.00 0.00 1 3.6 0.82 0.12 2 6.6 0.67 0.22 3 9.0 0.55 0.30 4 21.0 0.00 0.70
如果要使用sklearn的MinMaxScaler也可以实现,需要提前对数值做自定义区间截断,再手动指定scaler的拟合边界即可,相对而言自定义函数的灵活性更高,更适配双向映射的需求。
内容的提问来源于stack exchange,提问作者JoshZ
相关产品推荐
相关产品推荐

