将指定字典转换为适配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
相关产品推荐
相关产品推荐

