基于三元组键字典构造人员-日期维度的Pandas DataFrame
问题描述
给定一个字典,键是三元组(i, t, k):
i= 人员索引t= 日期k= 班次
对应的值为0.0或1.0,值为1.0代表该人员在对应日期的该班次需要上班。
需要构造一个Pandas DataFrame,要求:
- 行索引为人员索引
i - 列为日期
t - 单元格内容:如果当天有上班班次,显示对应的
k;无上班则显示0
预期输出格式如下:
Day 1 Day 2 Day 3 Person 1 2 2 0 2 1 0 1 3 1 2 0
给定的字典代码:
import pandas as pd work_dict = {(1, 1, 1): 0.0, (1, 1, 2): 1.0, (1, 2, 1): 0.0, (1, 2, 2): 1.0, (1, 3, 1): 0.0, (1, 3, 2): 0.0, (2, 1, 1): 1.0, (2, 1, 2): 0.0, (2, 2, 1): 0.0, (2, 2, 2): 0.0, (2, 3, 1): 1.0, (2, 3, 2): 0.0, (3, 1, 1): 1.0, (3, 1, 2): 0.0, (3, 2, 1): 0.0, (3, 2, 2): 1.0, (3, 3, 1): 0.0, (3, 3, 2): 0.0}
解决方案
直接通过以下代码实现需求:
import pandas as pd work_dict = {(1, 1, 1): 0.0, (1, 1, 2): 1.0, (1, 2, 1): 0.0, (1, 2, 2): 1.0, (1, 3, 1): 0.0, (1, 3, 2): 0.0, (2, 1, 1): 1.0, (2, 1, 2): 0.0, (2, 2, 1): 0.0, (2, 2, 2): 0.0, (2, 3, 1): 1.0, (2, 3, 2): 0.0, (3, 1, 1): 1.0, (3, 1, 2): 0.0, (3, 2, 1): 0.0, (3, 2, 2): 1.0, (3, 3, 1): 0.0, (3, 3, 2): 0.0} # 把字典转换成DataFrame,拆分三元组键为三列 df = pd.DataFrame([(i, t, k, v) for (i, t, k), v in work_dict.items()], columns=['Person', 'Day', 'Shift', 'Is_Working']) # 筛选出上班的记录(Is_Working=1.0) working_records = df[df['Is_Working'] == 1.0] # 构造透视表,行是Person,列是Day,值为Shift,缺失值填充为0 result_df = working_records.pivot(index='Person', columns='Day', values='Shift').fillna(0) # 给列名加上"Day "前缀,匹配预期格式 result_df.columns = [f'Day {col}' for col in result_df.columns] # 打印结果 print(result_df)
代码说明
- 先把字典的键值对拆分成结构化的DataFrame,方便后续处理;
- 只保留实际上班的记录,排除掉值为0.0的条目;
- 用透视表把人员和日期对应起来,自动匹配对应的上班班次,没有上班的位置用0填充;
- 最后调整列名格式,和预期输出一致。
运行代码后,输出结果和预期完全匹配。
内容的提问来源于stack exchange,提问作者nflgreaternba
相关产品推荐
相关产品推荐

