使用pivot

时间:2018-02-14 13:53:24

标签: 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],
                        '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

有没有办法只用枢轴直接产生这个输出? 如果没有,你能告诉我你将如何以有效的方式做到这一点。 谢谢。

2 个答案:

答案 0 :(得分:0)

我认为您需要swaplevel + sort_index

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

答案 1 :(得分:0)

这是一种明确的方式。但请使用@jezrael's pandonic solution

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