多个pandas DataFrame按数值比较计算得分 无冗余for循环实现方案
解决方案
核心思路是通过表对齐+向量化运算替代行遍历,仅用数行Pandas原生操作即可完成计算,性能远高于逐行循环实现,同时支持动态变化的职业、组别、指标列:
import pandas as pd # 1. 动态获取所有指标列(自动适配新增/删除的指标,无需硬编码) metric_cols = [col for col in summary_data.columns if col not in ["Profession", "Group"]] # 2. 重命名阈值、权重表的指标列,避免合并时列名冲突 thresh_renamed = threshold_data.rename(columns={col: f"{col}_thresh" for col in metric_cols}) weight_renamed = weightage_data.rename(columns={col: f"{col}_weight" for col in metric_cols}) # 3. 按职业+组别对齐三个表的数据 merged_df = summary_data.merge( thresh_renamed, on=["Profession", "Group"], how="left" ).merge( weight_renamed, on=["Profession", "Group"], how="left" ) # 4. 全向量化计算总分:符合阈值则累加对应权重 # 生成指标是否达标的布尔掩码 reach_threshold_mask = merged_df[metric_cols].ge(merged_df[[f"{c}_thresh" for c in metric_cols]].values) # 提取对应权重矩阵 weight_matrix = merged_df[[f"{c}_weight" for c in metric_cols]] # 按行累加符合条件的权重得到总分 summary_data["total_score"] = reach_threshold_mask.mul(weight_matrix.values).sum(axis=1)
结果验证
运行后summary_data的total_score列结果完全匹配需求规则,示例验证:
- 职业为Doctor、组别为1的两名人员得分分别为12、7,和需求举例完全一致。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

