基于Pandas多列生成标准化总分:无临时列与权重均衡方案咨询
解决方案
1. 无需创建临时列的实现方式
直接在赋值环节完成映射与求和,不需要单独生成range_score临时列,两种简洁写法如下:
- 直接赋值法:
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'level_count': [1,2,3,1], 'range_bins': ['low', 'medium', 'high', 'very_high'] }) # 直接映射range_bins并与level_count求和生成total_score df['total_score'] = df['level_count'] + df['range_bins'].map({ 'low': 1, 'medium': 2, 'high': 3, 'very_high': 4 })
- 链式assign法(适合保持原DataFrame不变或链式操作场景):
df = df.assign( total_score=lambda x: x['level_count'] + x['range_bins'].map({ 'low': 1, 'medium': 2, 'high': 3, 'very_high': 4 }) )
2. 标准化实现等权重(含后续扩展方案)
要让取值范围不同的列权重相同,核心是将每列数值缩放到相同区间,确保单列对总分的贡献上限一致。针对你的需求,推荐用最小-最大标准化(Min-Max Scaling),同时预留后续新增列的扩展能力:
步骤说明:
- 将
range_bins映射为数值(1-4) - 对每列做Min-Max缩放,将值缩至
[0,1]区间 - 按列数平均分配权重(当前两列各占50%,后续新增列时自动调整权重占比)
代码实现:
# 定义Min-Max标准化函数 def scale_column(col): return (col - col.min()) / (col.max() - col.min()) # 映射range_bins为数值 df['range_numeric'] = df['range_bins'].map({ 'low':1, 'medium':2, 'high':3, 'very_high':4 }) # 指定需要参与计算的列(后续新增列直接加入此列表) target_cols = ['level_count', 'range_numeric'] # 生成标准化后的列名 scaled_cols = [f'{col}_scaled' for col in target_cols] # 对目标列做标准化 df[scaled_cols] = df[target_cols].apply(scale_column) # 按列数平均权重,保证所有列贡献同等重要 df['total_score'] = df[scaled_cols].mean(axis=1) # 若需要将总分缩放到0-10等区间,可追加: # df['total_score'] = df['total_score'] * 10
扩展适配:
后续新增类似列时,只需将新列名加入target_cols列表,代码会自动完成标准化并平均权重,确保所有列对总分的影响程度一致。
内容的提问来源于stack exchange,提问作者nipy
相关产品推荐
相关产品推荐

