Python 使用pivot对多索引数据帧重新排序

Python 使用pivot对多索引数据帧重新排序,python,pandas,dataframe,pivot,Python,Pandas,Dataframe,Pivot,我有一个数据帧df1,看起来像这样: df1 = pd.DataFrame({'ID': [1,2,3,4,5,6], 'date': [1, 1, 1, 2, 2, 2], 'p_id': [1, 2, 3, 1, 2, 3], '9h30': [0.11,0.12,0.13,0.14,0.15,0.16],

我有一个数据帧df1,看起来像这样:

df1 = pd.DataFrame({'ID': [1,2,3,4,5,6],
                       'date': [1, 1, 1, 2, 2, 2],
                       'p_id': [1, 2, 3, 1, 2, 3],
                        '9h30': [0.11,0.12,0.13,0.14,0.15,0.16],
                        '9h35': [0.21,0.22,0.23,0.24,0.25,0.26],
                        '9h40': [0.31,0.32,0.33,0.34,0.35,0.36]})
df1.set_index('ID', inplace=True)

    9h30  9h35  9h40  date  p_id
ID                              
1   0.11  0.21  0.31     1     1
2   0.12  0.22  0.32     1     2
3   0.13  0.23  0.33     1     3
4   0.14  0.24  0.34     2     1
5   0.15  0.25  0.35     2     2
6   0.16  0.26  0.36     2     3
如果我使用
df2=df.pivot(index='p_id',columns='date')
我会得到df2:

      9h30        9h35        9h40      
date     1     2     1     2     1     2
p_id                                    
1     0.11  0.14  0.21  0.24  0.31  0.34
2     0.12  0.15  0.22  0.25  0.32  0.35
3     0.13  0.16  0.23  0.26  0.33  0.36
但这并不是我想要的,这就是df3:

date         1                 2
      9h30  9h35  9h40  9h30  9h35  9h40
p_id                                    
1     0.11  0.21  0.31  0.14  0.24  0.34
2     0.12  0.22  0.32  0.15  0.25  0.35
3     0.13  0.23  0.33  0.16  0.26  0.36
有没有一种方法可以只使用pivot直接生成此输出? 如果没有,你能告诉我你将如何以一种有效的方式做这件事吗。 谢谢。

我想你需要+:


这是一种明确的方式。但还是跟着我走吧


它工作得很好,谢谢你,但是你能确认没有办法用pivot直接从df1到df3吗?你可以使用替代方法
df2=df1。设置索引(['date','p\u id'])。取消堆栈(0)
df2=df1。设置索引(['p\u id','date'])。取消堆栈()
,但这两种方法都有相同的问题。看来不是。我将使用@jezrael的解决方案,但感谢您展示了另一种方法,看到不同的可能性总是很有用的。
df2 = df2.swaplevel(0,1, axis=1).sort_index(axis=1)
print (df2)
date     1                 2            
      9h30  9h35  9h40  9h30  9h35  9h40
p_id                                    
1     0.11  0.21  0.31  0.14  0.24  0.34
2     0.12  0.22  0.32  0.15  0.25  0.35
3     0.13  0.23  0.33  0.16  0.26  0.36
time, date = list(df2.columns.get_level_values(0)), list(df2.columns.get_level_values(1))
df2.columns.set_levels(date, level=0, inplace=True)
df2.columns.set_levels(time, level=1, inplace=True)

#          1           2           1          2     
# date  9h30  9h30  9h30  9h30  9h30  9h30 9h30 9h30
# p_id                                              
# 1     0.11  0.14  0.21  0.24  0.31  0.34    1    4
# 2     0.12  0.15  0.22  0.25  0.32  0.35    2    5
# 3     0.13  0.16  0.23  0.26  0.33  0.36    3    6