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

Pandas透视表排序求助:按月份排序且保留客户列

解决Pandas透视表按月份排序并保留客户分组的问题

嘿,我之前也折腾过一模一样的问题,终于摸出靠谱的解决办法了!你现在生成的透视表把client和month设成了多层索引,要实现每个客户下的月份从1到12有序排列,其实两步就能搞定:

  • 第一步:确保月份列是可正确排序的类型
    如果你的month列当前是字符串格式(比如'1'、'2'这类),先把它转换成整数类型,避免出现'10'排在'2'前面的乌龙:

    vp_clients['month'] = vp_clients['month'].astype(int)
    

    要是你的月份是中文名称(比如'1月'、'2月')或者英文名称(比如'Jan'、'Feb'),那就把它转换成有序类别,让Pandas明确知道正确的月份顺序:

    from pandas.api.types import CategoricalDtype
    
    # 按实际使用的月份名称顺序填写
    month_order = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
    month_cat_type = CategoricalDtype(categories=month_order, ordered=True)
    vp_clients['month'] = vp_clients['month'].astype(month_cat_type)
    
  • 第二步:对透视表的多层索引排序
    生成透视表之后,直接用sort_index()方法指定排序规则,这样每个客户下面的月份会严格按1到12排列,同时保留客户的分组结构:

    df = pd.pivot_table(vp_clients, values='hours', index=['client', 'month'], aggfunc=sum)
    # 按客户分组,每组内按月份升序排列
    df_sorted = df.sort_index(level=['client', 'month'])
    

    你也可以用索引的位置来指定排序层级(month是第二个索引,位置为1),效果完全一致:

    df_sorted = df.sort_index(level=1)
    

这样处理后,你的透视表就会完美呈现每个客户对应1-12月的小时数,排序完全符合预期啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:22:27