You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:25:38