数据透视表中的“重新订购”列

时间:2019-02-14 07:54:07

标签: python pandas dataframe pivot

我正在寻找一种对数据透视表中的列进行重新排序的方法

我的专栏很少见:

pivot.columns
pivot = dfpivot.pivot_table(index=['DEPARTMENT_NAME','LEVEL_NAME','NAME','CLTNAME'],columns=['StaffitWeek'], values=['ASSIGN_TIME'], margins=False, aggfunc=np.sum,fill_value=0)
pivot.columns

输出:

MultiIndex(levels=[['ASSIGN_TIME'], ['S10', 'S11', 'S12', 'S13', 'S14', 'S15', 'S16', 'S17', 'S18', 'S19', 'S6', 'S7', 'S8', 'S9']],
           labels=[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]],
           names=[None, 'StaffitWeek'])

我想对“级别”列重新排序并改为按顺序S6 S7 S8 S9 S10 S11 S12 S13 S14 S15 S16 S17 S18 S19

我尝试了许多主题,但我无法做到。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

首先删除[]以避免在列中使用MultiIndex:

df = dfpivot.pivot_table(index=['DEPARTMENT_NAME','LEVEL_NAME','NAME','CLTNAME'],
                            columns='StaffitWeek', 
                            values='ASSIGN_TIME', 
                            aggfunc=np.sum,
                            fill_value=0)

然后按传递列名称排序到sorted函数,并通过索引删除第一个字母:

df = df[sorted(df.columns, key=lambda x: int(x[1:]))]

或使用str.extract提取整数,通过argsort转换并获得位置:

df = df.iloc[:, df.columns.str.extract('(\d+)', expand=False).astype(int).argsort()]

或使用natsort

import natsort as ns
df = df[sorted(ns.natsorted(df.columns), key=lambda x: not x.isdigit())]