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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:57:04