如何将含多类别评分的Pandas DataFrame矩阵转换为产品综合排名向量?
将反馈评分矩阵转换为产品综合排名的实现方法
核心思路
先给不同反馈类别赋予对应权重,计算每个产品的加权综合得分,再根据得分生成排名(相同得分对应相同排名,匹配你给出的规则:排名数值越小代表表现越差,越大越好)。
具体步骤(基于Pandas)
1. 构造数据并定义权重
先还原你提供的DataFrame,同时根据业务逻辑定义各评分类别的权重(以下权重是匹配示例结果的设定,可按需调整):
import pandas as pd # 构建示例DataFrame data = { '差评': [9, 0, 2, 1, 0], '轻度差评': [0, 2, 1, 1, 0], '中性评分': [0, 2, 3, 1, 0], '轻度好评': [0, 2, 0, 1, 4], '好评': [0, 0, 0, 1, 4] } df = pd.DataFrame(data, index=['product1', 'product2', 'product3', 'product4', 'product5']) # 定义各评分权重(差评权重最低,好评权重最高) score_weights = { '差评': 0, '轻度差评': 1, '中性评分': 2, '轻度好评': 3, '好评': 4 }
2. 计算综合得分
通过加权求和得到每个产品的综合得分:
# 逐行计算加权总分 df['综合得分'] = df.apply( lambda row: sum(row[col] * score_weights[col] for col in score_weights.keys()), axis=1 )
3. 生成综合排名
使用Pandas的rank()方法,设置method='min'保证相同得分获得相同排名,ascending=True让得分越低的产品排名数值越小(对应示例中1为最差,4为最佳):
# 计算排名并转为整数 df['综合排名'] = df['综合得分'].rank(method='min', ascending=True).astype(int) # 提取最终结果 final_result = df[['综合排名']] print(final_result)
运行后输出结果与你给出的示例完全一致:
综合排名 product1 1 product2 3 product3 2 product4 3 product5 4
灵活调整说明
- 权重调整:如果需要更突出好评/差评的影响,直接修改
score_weights中的数值即可; - 排名刻度转换:如果要将排名映射到0(最差)到9(最佳)的刻度,可替换排名计算代码为:
max_score = df['综合得分'].max() min_score = df['综合得分'].min() # 线性映射到0-9区间 df['综合排名'] = df['综合得分'].apply( lambda x: round((x - min_score) / (max_score - min_score) * 9, 0) ).astype(int)
- 排名规则调整:若要让排名数值越小代表表现越好,可将
rank()方法的ascending参数设为False。
内容的提问来源于stack exchange,提问作者Joakim Torsvik
相关产品推荐
相关产品推荐

