如何对pandas透视表DataFrame的星期字段按自然顺序排序?
问题原因
你遇到KeyError: 'day_of_week'的核心原因是该透视表的day_of_week属于多级行索引的一级,并非普通数据列,直接按列名访问无法匹配到对应字段。而最初直接排序得到乱序结果,是因为字符串默认按字典序排列,不符合星期的自然顺序。
解决方案
这里提供两种常用实现方式,都不会丢失任何星期数据:
方式1:直接修改索引属性排序(无需改动原有表结构)
import pandas as pd # 定义星期的正确排序规则 week_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] # 给索引中day_of_week层级设置有序分类类型 df3.index = df3.index.set_levels( pd.Categorical(df3.index.get_level_values('day_of_week').unique(), categories=week_order, ordered=True), level='day_of_week' ) # 按day_of_week索引层级排序即可得到正确结果 df4 = df3.sort_index(level='day_of_week')
方式2:索引转列处理(适合后续需要频繁操作星期字段的场景)
import pandas as pd week_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] # 将所有行索引重置为普通数据列 df_reset = df3.reset_index() # 此时day_of_week为普通列,可正常设置有序分类 df_reset['day_of_week'] = pd.Categorical(df_reset['day_of_week'], categories=week_order, ordered=True) # 按字段排序 df_sorted = df_reset.sort_values(by='day_of_week') # 如果需要保留原透视表的多级索引结构,排序后重新设置索引即可 df4 = df_sorted.set_index(['member_casual', 'rideable_type', 'day_of_week'])
两种方案最终输出的df4都会按照指定的星期顺序排列,所有原有数据都会完整保留。
内容的提问来源于stack exchange,提问作者Nikhil
相关产品推荐
相关产品推荐

