在 .sort_index(level=1, axis=1) 之后自定义 pivot table 中列的顺序

Cutomise the ordering of columns in pivot table after .sort_index(level=1, axis=1)

数据框df1

    TYPE  WEEK  A  B  C  D
0  Type1     1  1  1  1  1
1  Type2     2  2  2  2  2
2  Type3     3  3  3  3  3
3  Type4     4  4  4  4  4

预期输出

         A    C    B    D    A    C    B    D    A    C    B    D    A    C    B    D
WEEK     1    1    1    1    2    2    2    2    3    3    3    3    4    4    4    4
TYPE
Type1  1.0  1.0  1.0  1.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
Type2  NaN  NaN  NaN  NaN  2.0  2.0  2.0  2.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
Type3  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  3.0  3.0  3.0  3.0  NaN  NaN  NaN  NaN
Type4  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  4.0  4.0  4.0  4.0

我的做法:

df1 = pd.DataFrame(df1)

colname = list(df1.head())
tuples = []

for i in colname:
    tuples.append((i,colname.index(i)+1))
    
index = pd.MultiIndex.from_tuples(tuples, names=["COLUMN", "ORDER"])   
df2 = pd.DataFrame(df1.values, columns=index)

df3 = pd.pivot_table(df1,index="TYPE",columns="WEEK", values=['A','B','C','D']).sort_index(level=1, axis=1)
#For df3 cannot attain the expected result because .sort_index(level=1, axis=1) will sort them out alphabetically to ['A','B','C','D']

.sort_index(level=1, axis=1) 需要交换枢轴的水平 table。

生成另一个数据帧 df2 以将列的顺序固定为 ['A','C','B','D'] 以用于数据透视表 table

COLUMN   TYPE WEEK  A  B  C  D
ORDER       1    2  3  4  5  6
0       Type1    1  1  1  1  1
1       Type2    2  2  2  2  2
2       Type3    3  3  3  3  3
3       Type4    4  4  4  4  4

旋转前创建 CategoricalDtype

cat = pd.CategoricalDtype(['A', 'C', 'B', 'D'], ordered=True)

df3 = df.melt(['TYPE', 'WEEK'], var_name='COLUMN').astype({'COLUMN': cat}) \
        .pivot_table('value', 'TYPE', ['COLUMN', 'WEEK']).sort_index(level=1, axis=1)

输出

>>> df3
COLUMN    A    C    B    D    A    C    B    D    A    C    B    D    A    C    B    D
WEEK      1    1    1    1    2    2    2    2    3    3    3    3    4    4    4    4
TYPE                                                                                  
Type1   1.0  1.0  1.0  1.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
Type2   NaN  NaN  NaN  NaN  2.0  2.0  2.0  2.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
Type3   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  3.0  3.0  3.0  3.0  NaN  NaN  NaN  NaN
Type4   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  4.0  4.0  4.0  4.0