使用np.where结合字典实现向量化计算所需辅导时长
解决方案
核心思路是先把等级到累计辅导时长的映射关系提前计算好,再通过向量化方式直接计算当前与目标等级的累计时长差,避免逐元素遍历字典。
步骤1:构建累计时长映射
先将“升级到某等级所需的单次时长”转换为“从初始等级升到该等级的总时长”。比如字典coaching_hours_per_level如果是{2:5,3:7,4:10}(表示1→2需5小时,2→3需7小时,3→4需10小时),对应的累计时长映射应为{1:0,2:5,3:12,4:22}。
代码示例:
import pandas as pd import numpy as np # 示例输入数据 coaching_hours_per_level = {2:5, 3:7, 4:10, 5:15} # 等级n-1→n的时长 df1 = pd.DataFrame({ 'Python': [2,1,3,2], 'SQL': [3,2,2,4] }, index=['Alice','Bob','Charlie','David']) target_df = pd.DataFrame({ 'Python': [3,4,2,5], 'SQL': [4,3,2,5] }, index=['Alice','Bob','Charlie','David']) # 构建累计时长字典 level_to_total = {1:0} current_total = 0 # 按等级顺序累加时长 for level in sorted(coaching_hours_per_level.keys()): current_total += coaching_hours_per_level[level] level_to_total[level] = current_total # 处理可能存在的超出字典范围的等级(可选,根据实际业务调整) max_dict_level = max(coaching_hours_per_level.keys()) all_levels = sorted(set(df1.values.flatten()).union(set(target_df.values.flatten()))) for level in all_levels: if level > max_dict_level: # 假设超出部分按最高等级的单次时长累加 extra_levels = level - max_dict_level level_to_total[level] = level_to_total[max_dict_level] + coaching_hours_per_level[max_dict_level] * extra_levels
步骤2:向量化计算所需时长
利用pandas的向量化映射或numpy数组索引,直接计算当前与目标等级的累计时长差,再通过np.where处理“当前≥目标则为0”的逻辑。
方法A:使用字典映射(适用于非连续等级)
# 将当前等级和目标等级映射为累计时长 current_total_hours = df1.applymap(lambda x: level_to_total[x]) target_total_hours = target_df.applymap(lambda x: level_to_total[x]) # 计算最终所需时长 required_hours = np.where(df1 >= target_df, 0, target_total_hours - current_total_hours) required_hours_df = pd.DataFrame(required_hours, index=df1.index, columns=df1.columns)
方法B:使用numpy数组索引(适用于连续整数等级,效率更高)
如果等级是连续的整数,可以将累计时长转为数组,直接通过索引取值,完全避免遍历:
# 确定最大等级 max_level = max(level_to_total.keys()) # 创建累计时长数组,索引对应等级 level_total_arr = np.zeros(max_level + 1) for level in range(2, max_level + 1): level_total_arr[level] = level_total_arr[level-1] + coaching_hours_per_level.get(level, 0) # 直接通过数组索引获取累计时长(向量化操作) current_total = level_total_arr[df1] target_total = level_total_arr[target_df] # 计算所需时长 required_hours = np.where(df1 >= target_df, 0, target_total - current_total) required_hours_df = pd.DataFrame(required_hours, index=df1.index, columns=df1.columns)
结果示例
最终required_hours_df会输出每个人每项技能的所需辅导时长,比如Alice的Python当前2级、目标3级,所需时长为7小时;SQL当前3级、目标4级,所需时长为10小时,以此类推。
内容的提问来源于stack exchange,提问作者Yolao_21
相关产品推荐
相关产品推荐

