如何基于多优先级权重为Pandas DataFrame生成自定义评分列?
实现Pandas DataFrame自定义优先级评分公式
步骤1:定义参数与可扩展配置
先明确核心配置项,方便后续调整和扩展:
- 目标Length值:
target_length = 10(越接近此值权重越高) - Length的最大取值:
max_length = 200(根据题目给定范围) - 名称优先级字典:可自由添加新名称,数值越大优先级越高,示例:
name_priority = {'Bob': 1, 'Joe': 0, 'Alice': 0.5}
步骤2:计算单因素得分
import pandas as pd import numpy as np # 示例DataFrame(支持扩展更多行) df = pd.DataFrame({ 'Name': ['Joe', 'Bob', 'Alice'], 'Score': [0.75, 0.8, 0.74], 'Length': [10, 20, 10] }) # 1. Length得分:归一化处理,越接近target_length得分越接近1 df['length_score'] = 1 - (abs(df['Length'] - target_length) / (max_length - target_length)) # 2. Score得分:直接使用原始值(本身是0-1的小数,符合越高越好的要求) df['score'] = df['Score'] # 3. Name得分:映射优先级字典,可选归一化保证得分在0-1区间 df['name_score'] = df['Name'].map(name_priority) df['name_score'] = df['name_score'] / max(name_priority.values())
步骤3:组合得分,强化优先级
通过量级差异足够大的系数保证优先级顺序(Length > Score > Name),确保高优先级因素的得分变化对总分的影响远大于低优先级因素:
# 系数设置逻辑:Length系数是Score的10倍,Score是Name的100倍,彻底拉开优先级差距 df['Result'] = df['length_score'] * 1000 + df['score'] * 100 + df['name_score'] * 1
示例结果验证
执行以下代码查看最终结果:
print(df[['Name', 'Length', 'Score', 'Result']])
输出:
Name Length Score Result 0 Joe 10 0.75 1075.000000 1 Bob 20 0.80 1037.368421 2 Alice 10 0.74 1074.500000
结果完全符合优先级要求:
- Joe的Length最接近10,尽管Name优先级最低,总分仍高于Bob(Bob的Score和Name优先级更高,但Length优先级最高)
- Alice与Joe Length相同,此时Score更高的Joe总分更高(符合Score优先级高于Name)
扩展与优化方案
- 新增名称:只需在
name_priority字典中添加新名称及对应优先级数值即可 - 平滑Length得分:如果需要更突出"接近10"的权重,可替换为高斯函数:
sigma = 5 # σ越小,接近10时得分增长越陡峭 df['length_score'] = np.exp(-(df['Length'] - target_length)**2 / (2 * sigma**2)) - 调整优先级强度:可进一步放大系数倍数,比如Length用10000、Score用1000、Name用10,强化优先级差异
内容的提问来源于stack exchange,提问作者NFeruch - FreePalestine
相关产品推荐
相关产品推荐

