我正在寻找一种对数据透视表中的列进行重新排序的方法
我的专栏很少见:
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
。
我尝试了许多主题,但我无法做到。
感谢您的帮助
答案 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())]