基于Python实现类别权重动态分配(缺失类别场景)
当然有通用的实现方法!这种动态权重分配的需求在处理缺失类别数据时很常见,下面我会用Python + Pandas来演示一个简洁且可扩展的方案(虽然你只提到三类,但这个思路可以轻松扩展到更多类别):
核心思路
- 先定义好原始的预定义权重映射
- 对每一行数据,识别出非缺失的类别(即d1、d2、d3中不为空的列)
- 计算所有缺失类别对应的权重总和,将这个总和平均分配给每个非缺失类别,得到新的权重
- 用新权重和对应非缺失的d值计算加权得分
具体实现代码
假设你的DataFrame命名为df,包含d1、d2、d3列,我们可以用apply函数逐行处理:
import pandas as pd import numpy as np # 1. 定义原始预定义权重 original_weights = {'d1': 0.5, 'd2': 0.3, 'd3': 0.2} def calculate_dynamic_score(row): # 获取当前行的d值,过滤出非缺失的项 non_missing = row[['d1', 'd2', 'd3']].dropna() non_missing_cols = non_missing.index.tolist() # 处理全缺失的极端情况(如果业务允许,这里可返回NaN或自定义默认值) if len(non_missing_cols) == 0: return np.nan # 2. 计算缺失类别的总权重 missing_weight = sum([original_weights[col] for col in original_weights if col not in non_missing_cols]) # 3. 计算每个非缺失类别的新权重:原始权重 + 缺失权重均分 weight_per_non_missing = missing_weight / len(non_missing_cols) new_weights = {col: original_weights[col] + weight_per_non_missing for col in non_missing_cols} # 4. 计算加权得分 score = sum(non_missing[col] * new_weights[col] for col in non_missing_cols) return score # 应用到DataFrame,生成SCORE列 df['SCORE'] = df.apply(calculate_dynamic_score, axis=1)
验证场景示例
举几个典型场景验证逻辑:
- 三类数据都存在:新权重与原始权重完全一致,得分 =
d1*0.5 + d2*0.3 + d3*0.2 - d3缺失:缺失权重为0.2,平均分给d1和d2各0.1 → 新权重为
{'d1':0.6, 'd2':0.4},得分 =d1*0.6 + d2*0.4 - 仅d1存在:缺失权重为0.3+0.2=0.5,全部分给d1 → 新权重为
{'d1':1.0},得分 =d1*1.0
扩展说明
如果后续需要增加更多类别(比如C4、C5),只需修改original_weights字典即可,核心逻辑完全不需要改动,通用性拉满。
内容的提问来源于stack exchange,提问作者Shankar Pandey
相关产品推荐
相关产品推荐

