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

将指定字典转换为适配Plotly绘图的Pandas DataFrame

排班字典转Pandas DataFrame并适配可视化方案

需求说明

给定字典的键为三元组(人员索引i、日期索引t、班次),值为0.0或1.0(1表示该班次被排班)。需将其转换为行对应人员索引、列对应日期索引的DataFrame,单元格值为当日被排班的班次(无班次则填0),且适配指定的Plotly可视化函数。

可视化函数(中文适配版)

def visualize(data):
    title_str = '排班表可视化'
    # 绘制热力图,列对应日期1-7,颜色映射匹配班次/休息状态
    fig = px.imshow(data[[str(i) for i in range(1, 8)]], 
                    color_continuous_scale=["red", "orange", "blue", 'black'],
                    title=title_str,)
    # 设置悬停提示内容
    fig.update(data=[{'hovertemplate': "日期: %{x}<br>"
                                       "人员: %{y}<br>",
                      }])
    # 配置颜色条:刻度值对应状态,文本说明对应班次/休息
    colorbar = dict(thickness=25,
                     tickvals=[0, 1, 2, 3],
                     ticktext=['早班', '中班', '晚班', '休息'])
    fig.update(layout_coloraxis_showscale=True, layout_coloraxis_colorbar=colorbar)
    fig.show()
 
    return fig

字典转DataFrame实现代码

import pandas as pd
import plotly.express as px

# 给定的排班字典
dic = {(1, 1, 1): 0.0, (1, 1, 2): 0.0, (1, 1, 3): 1.0, (1, 2, 1): 0.0, (1, 2, 2): 1.0, (1, 2, 3): 0.0, (1, 3, 1): 0.0, (1, 3, 2): 0.0, (1, 3, 3): 0.0, (1, 4, 1): 0.0, (1, 4, 2): 1.0, (1, 4, 3): 0.0, (1, 5, 1): 1.0, (1, 5, 2): 0.0, (1, 5, 3): 0.0, (1, 6, 1): 0.0, (1, 6, 2): 1.0, (1, 6, 3): 0.0, (1, 7, 1): 0.0, (1, 7, 2): 1.0, (1, 7, 3): 0.0, (2, 1, 1): 1.0, (2, 1, 2): 0.0, (2, 1, 3): 0.0, (2, 2, 1): 1.0, (2, 2, 2): 0.0, (2, 2, 3): 0.0, (2, 3, 1): 1.0, (2, 3, 2): 0.0, (2, 3, 3): 0.0, (2, 4, 1): 0.0, (2, 4, 2): 0.0, (2, 4, 3): 0.0, (2, 5, 1): 1.0, (2, 5, 2): 0.0, (2, 5, 3): 0.0, (2, 6, 1): 0.0, (2, 6, 2): 0.0, (2, 6, 3): 1.0, (2, 7, 1): 0.0, (2, 7, 2): 1.0, (2, 7, 3): 0.0, (3, 1, 1): 1.0, (3, 1, 2): 0.0, (3, 1, 3): 0.0, (3, 2, 1): 0.0, (3, 2, 2): 1.0, (3, 2, 3): 0.0, (3, 3, 1): 0.0, (3, 3, 2): 0.0, (3, 3, 3): 0.0, (3, 4, 1): 1.0, (3, 4, 2): 0.0, (3, 4, 3): 0.0, (3, 5, 1): 1.0, (3, 5, 2): 0.0, (3, 5, 3): 0.0, (3, 6, 1): 1.0, (3, 6, 2): 0.0, (3, 6, 3): 0.0, (3, 7, 1): 0.0, (3, 7, 2): 1.0, (3, 7, 3): 0.0}

# 1. 将字典拆分为结构化DataFrame
df = pd.DataFrame([(k[0], k[1], k[2], v) for k, v in dic.items()], 
                  columns=['人员索引', '日期索引', '班次', '是否排班'])

# 2. 筛选出实际被排班的记录
scheduled_records = df[df['是否排班'] == 1.0]

# 3. 转换为目标行列结构,无排班日期填充0
result_df = scheduled_records.pivot(index='人员索引', columns='日期索引', values='班次').fillna(0)

# 4. 将列名转为字符串,适配可视化函数的列选择逻辑
result_df.columns = result_df.columns.astype(str)

# 5. 调用可视化函数生成热力图
visualize(result_df)

代码逻辑说明

  • 拆分字典:把三元组键拆分为人员、日期、班次三列,保留排班标记
  • 筛选有效记录:只保留被排班的条目,过滤未排班数据
  • 重构结构:通过pivot转换为人员×日期的矩阵,无排班日期用0填充
  • 列名适配:将日期列转为字符串,匹配可视化函数的列选择规则
  • 最终生成的DataFrame完全适配可视化要求,颜色对应关系:0=休息(黑色)、1=早班(红色)、2=中班(橙色)、3=晚班(蓝色)

内容的提问来源于stack exchange,提问作者nflgreaternba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:26:01