Python 通过pivot重新排列列层次结构或更改排序顺序

Python 通过pivot重新排列列层次结构或更改排序顺序,python,pandas,indexing,Python,Pandas,Indexing,我可以用 df2 = pd.DataFrame( { "Day": np.array([1,1,1,2,2,2,3,3,3], dtype="int32"), "Subject": np.array(['a','b','c','a','b','c','a','b','c']), "Breakfast": np.random.randn(9), "Lunch": n

我可以用

df2 = pd.DataFrame(
{
   "Day": np.array([1,1,1,2,2,2,3,3,3], dtype="int32"),
    "Subject": np.array(['a','b','c','a','b','c','a','b','c']),
     "Breakfast": np.random.randn(9),
     "Lunch": np.random.randn(9),
      "Dinner": np.random.randn(9),  
}
) df2

然后

生成:

并希望对列层次结构进行重新排序或更改,以便按日期和主题排列的数据详细信息按照以下方式排列在主题下:

如何重新排列列层次结构或列排序顺序以实现此目的?

旋转数据帧后,您可以使用轴1并沿着轴1进行:

df2.pivot(index="Day", columns="Subject").swaplevel(axis=1).sort_index(1)
或者,您可以使用后跟执行重塑:

df2.set_index(['Day', 'Subject']).stack().unstack([1, 2])


使用以下代码:

df3 = df2.pivot(index="Day", columns="Subject")
df3.columns = df3.columns.swaplevel()
df3.sort_index(axis=1, level=0, sort_remaining=False, inplace=True)
结果(对于我的随机数据)是:

Subject         a                             b                             c                    
        Breakfast     Lunch    Dinner Breakfast     Lunch    Dinner Breakfast     Lunch    Dinner
Day                                                                                              
1       -0.558349 -1.386076  1.518792  0.089063 -0.508046  1.095008 -0.260515 -0.087735  1.472237
2        0.876124 -0.574031 -1.089488 -1.439771  0.708469 -0.332422 -0.148037  1.285213 -1.313784
3        0.823619  0.714185  0.726317 -0.385264 -1.031764  0.924519  0.139066  0.296062  1.351840
df3 = df2.pivot(index="Day", columns="Subject")
df3.columns = df3.columns.swaplevel()
df3.sort_index(axis=1, level=0, sort_remaining=False, inplace=True)
Subject         a                             b                             c  
        Breakfast     Lunch    Dinner Breakfast     Lunch    Dinner Breakfast      Lunch    Dinner
Day                                                                                               
1       -2.199182  0.810676  1.119673  1.685167 -1.469196  0.838108 -0.751882   1.678362 -0.312479
2       -0.275628  1.224855  1.142574  0.699516 -0.898156 -1.796295  0.593565   0.606979  0.549299
3        0.043365  0.562309  0.881739  0.746961  0.002600  0.344138  0.937465   1.402463  2.065739