如何将Pandas时间表DataFrame转换为指定的小时列格式?
实现时间表DataFrame的行列转换(Pandas)
没问题,完全可以生成你想要的格式的DataFrame,用Pandas的透视表功能就能轻松实现。下面是具体的步骤和代码:
第一步:整理原始数据成结构化DataFrame
你提供的原始数据是扁平的文本格式,首先需要把它转换成标准的结构化DataFrame,包含day(星期)、hour(小时)、subjectid(课程ID)、facultyid(教师ID)这四列。我已经帮你把原始数据整理成了结构化列表,直接转成DataFrame即可:
import pandas as pd # 整理好的结构化数据列表 data = [ {"day": "mon", "hour": 1, "subjectid": "4CCI02", "facultyid": 5}, {"day": "mon", "hour": 2, "subjectid": "FR", "facultyid": 42}, {"day": "mon", "hour": 3, "subjectid": "4CS01", "facultyid": 39}, {"day": "mon", "hour": 4, "subjectid": "4MAT2", "facultyid": 46}, {"day": "mon", "hour": 5, "subjectid": "4CCI01", "facultyid": 29}, {"day": "mon", "hour": 6, "subjectid": "4MAT2", "facultyid": 46}, {"day": "mon", "hour": 7, "subjectid": "4CCI04", "facultyid": 47}, {"day": "mon", "hour": 8, "subjectid": "4CCI03", "facultyid": 21}, {"day": "tue", "hour": 1, "subjectid": "MC03", "facultyid": 48}, {"day": "tue", "hour": 2, "subjectid": "FR", "facultyid": 42}, {"day": "tue", "hour": 3, "subjectid": "4CCI04", "facultyid": 47}, {"day": "tue", "hour": 4, "subjectid": "4CCI02", "facultyid": 5}, {"day": "tue", "hour": 5, "subjectid": "4MAT2", "facultyid": 46}, {"day": "tue", "hour": 6, "subjectid": "4MAT2", "facultyid": 46}, {"day": "tue", "hour": 7, "subjectid": "4CCI01", "facultyid": 29}, {"day": "tue", "hour": 8, "subjectid": "4CS01", "facultyid": 39}, {"day": "wed", "hour": 1, "subjectid": "4CCI01", "facultyid": 29}, {"day": "wed", "hour": 2, "subjectid": "4MAT2", "facultyid": 46}, {"day": "wed", "hour": 3, "subjectid": "4CCI02", "facultyid": 5}, {"day": "wed", "hour": 4, "subjectid": "4CCI04", "facultyid": 47}, {"day": "wed", "hour": 5, "subjectid": "4MAT2", "facultyid": 46}, {"day": "wed", "hour": 6, "subjectid": "FR", "facultyid": 42}, {"day": "wed", "hour": 7, "subjectid": "4CCI03", "facultyid": 21}, {"day": "wed", "hour": 8, "subjectid": "4CS01", "facultyid": 39}, {"day": "thu", "hour": 1, "subjectid": "4CS01", "facultyid": 39}, {"day": "thu", "hour": 2, "subjectid": "4MAT2", "facultyid": 46}, {"day": "thu", "hour": 3, "subjectid": "4CCI02", "facultyid": 5}, {"day": "thu", "hour": 4, "subjectid": "4MAT2", "facultyid": 46}, {"day": "thu", "hour": 5, "subjectid": "4CCI01", "facultyid": 29}, {"day": "thu", "hour": 6, "subjectid": "MC03", "facultyid": 48}, {"day": "thu", "hour": 7, "subjectid": "FR", "facultyid": 42}, {"day": "thu", "hour": 8, "subjectid": "4CCI03", "facultyid": 21}, {"day": "fri", "hour": 1, "subjectid": "4CS01", "facultyid": 39}, {"day": "fri", "hour": 2, "subjectid": "4CCI02", "facultyid": 5}, {"day": "fri", "hour": 3, "subjectid": "4MAT2", "facultyid": 46}, {"day": "fri", "hour": 4, "subjectid": "4CCI03", "facultyid": 21}, {"day": "fri", "hour": 5, "subjectid": "4CCI04", "facultyid": 47}, {"day": "fri", "hour": 6, "subjectid": "4MAT2", "facultyid": 46}, {"day": "fri", "hour": 7, "subjectid": "FR", "facultyid": 42}, {"day": "fri", "hour": 8, "subjectid": "4CCI01", "facultyid": 29}, {"day": "sat", "hour": 1, "subjectid": "MC03", "facultyid": 48}, {"day": "sat", "hour": 2, "subjectid": "4MAT2", "facultyid": 46}, {"day": "sat", "hour": 3, "subjectid": "4CCI04", "facultyid": 47}, {"day": "sat", "hour": 4, "subjectid": "4CCI03", "facultyid": 21}, {"day": "sat", "hour": 5, "subjectid": "4CCI01", "facultyid": 29}, {"day": "sat", "hour": 6, "subjectid": "4MAT2", "facultyid": 46}, {"day": "sat", "hour": 7, "subjectid": "4CS01", "facultyid": 39}, {"day": "sat", "hour": 8, "subjectid": "FR", "facultyid": 42}, ] # 转换成DataFrame df = pd.DataFrame(data)
第二步:重塑数据为目标格式
接下来我们用Pandas的pivot方法来实现行列转换,把小时作为列,星期作为行,单元格内容是课程ID和教师ID的组合:
# 合并subjectid和facultyid为一个单元格内容 df['class_info'] = df['subjectid'] + ' ' + df['facultyid'].astype(str) # 透视表转换:行是day,列是hour,值是合并后的课程信息 pivoted_df = df.pivot(index='day', columns='hour', values='class_info') # 把列名转换成字符串(默认是整数,转成字符串更符合你的需求) pivoted_df.columns = pivoted_df.columns.astype(str) # 查看最终结果 print(pivoted_df)
运行这段代码后,你得到的DataFrame就会是你想要的格式:行是星期几,列是1-8小时,每个单元格对应该时段的课程和教师信息。
补充说明
如果你的原始DataFrame不是我们构造的这种结构化格式,而是类似你提供的扁平文本,那你需要先做数据清洗:遍历原始文本,识别每个星期的起始行,然后把对应的小时、课程ID、教师ID一一对应起来,转换成结构化的四列DataFrame,之后再执行上面的透视表步骤即可。
内容的提问来源于stack exchange,提问作者Natesh bhat
相关产品推荐
相关产品推荐

