如何基于DataFrame对比多列数值并实现自定义评分逻辑?
基于多列数值对比生成评分的解决方案
我来帮你搞定这个多维度对比评分的需求!结合你给出的DataFrame结构、高低优劣势列的定义,还有已有的compare_higher函数,我们可以一步步实现评分计算,下面是具体的思路和代码实现:
步骤1:明确核心逻辑
首先得理清几个关键点:
- 每个指标列(
Salary/Age/Cars)需要和对应的平均值列(Avg Salary/Avg Age/Avg Cars)做对比 - 对于
higher_better列表里的列,直接用你定义的compare_higher函数:数值高于平均值得1,等于得0,低于得-1 - 对于
lower_better列表里的列,逻辑要反转:数值低于平均值得1,等于得0,高于得-1——这其实等价于调用compare_higher(平均值, 当前值)
步骤2:代码实现
先准备基础数据和函数
import pandas as pd # 构造你的示例DataFrame df = pd.DataFrame({ 'Name': ['John', 'Tom'], 'Salary': [50000, 65000], 'Age': [35, 45], 'Cars': [1, 3], 'Avg Salary': [60000, 60000], 'Avg Age': [38, 38], 'Avg Cars': [1, 1] }) # 定义高低优劣势列 higher_better = ['Salary', 'Cars'] lower_better = ['Age'] # 你已定义的对比函数 def compare_higher(a, b): return 1 if a > b else 0 if a == b else -1
建立列映射关系
为了避免硬编码出错,我们先建立指标列和对应平均值列的映射:
col_mapping = { 'Salary': 'Avg Salary', 'Age': 'Avg Age', 'Cars': 'Avg Cars' }
封装评分计算函数
写一个通用函数来处理单个指标的评分:
def calculate_score(row, col, is_higher_better): # 获取当前行的指标值和对应平均值 val = row[col] avg_val = row[col_mapping[col]] if is_higher_better: # 越高越好,直接用compare_higher return compare_higher(val, avg_val) else: # 越低越好,反转对比逻辑 return compare_higher(avg_val, val)
生成各指标评分与总评分
遍历所有指标列,生成每个维度的评分,最后计算综合总评分:
# 为越高越好的列生成评分 for col in higher_better: df[f'{col}_Score'] = df.apply(lambda row: calculate_score(row, col, is_higher_better=True), axis=1) # 为越低越好的列生成评分 for col in lower_better: df[f'{col}_Score'] = df.apply(lambda row: calculate_score(row, col, is_higher_better=False), axis=1) # 计算总评分(所有维度评分之和) df['Total_Score'] = df[[f'{col}_Score' for col in higher_better + lower_better]].sum(axis=1)
步骤3:查看结果
运行完上面的代码后,你的DataFrame会新增各指标的评分列和总评分列,打印df会得到:
Name Salary Age Cars Avg Salary Avg Age Avg Cars Salary_Score Cars_Score Age_Score Total_Score 0 John 50000 35 1 60000 38 1 -1 0 1 0 1 Tom 65000 45 3 60000 38 1 1 1 -1 1
扩展说明
- 如果后续新增指标,只需要把指标名添加到
higher_better或lower_better列表,同时在col_mapping里补充对应的平均值列即可,扩展性很强 - 如果你不需要单独的指标评分列,也可以直接计算总评分,不过保留单独列更便于排查每个维度的表现
内容的提问来源于stack exchange,提问作者Karma
相关产品推荐
相关产品推荐

