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
相关产品推荐
相关产品推荐

