在python中从long转换为wide

时间:2016-07-22 07:21:19

标签: python pandas

我认为这是一个非常简单的问题。我是python的新手,我无法找到完美的答案。

我有一个数据框:

A          B       C       D       E
203704     WkDay   00:00   0.247   2015
203704     WkDay   00:30   0.232   2015
203704     Wkend   00:00   0.102   2015
203704     Wkend   00:30   0.0907  2015
203704     WkDay   00:00   0.28    2016
203704     WkDay   00:30   0.267   2016
203704     Wkend   00:00   0.263   2016
203704     Wkend   00:30   0.252   2016

我需要:

A       B      00:00   00:30    E
203704  Wkday  0.247   0.232   2015
203704  Wkend  0.102   0.0907  2015
203704  Wkday  0.28    0.267   2016
203704  Wkday  0.263   0.252   2016

我浏览了thisthis等各种链接。但是,实现它们我遇到了各种错误。

我能够成功运行

pandas.pivot_table(df,values='D',index='A',columns='C')

但它没有给出我想要的东西。

任何有关这方面的帮助都会有所帮助。

2 个答案:

答案 0 :(得分:5)

您可以添加多个列作为参数index的参数列出:

print (pd.pivot_table(df,index=['A', 'B', 'E'], columns='C',values='D').reset_index())
C       A      B     E  00:00   00:30
0  203704  WkDay  2015  0.247  0.2320
1  203704  WkDay  2016  0.280  0.2670
2  203704  Wkend  2015  0.102  0.0907
3  203704  Wkend  2016  0.263  0.2520

如果需要更改列的顺序:

#reset only last level of index
df1 = pd.pivot_table(df,index=['A', 'B', 'E'], columns='C',values='D').reset_index(level=-1)
#reorder first column to last
df1.columns = df1.columns[-1:] | df1.columns[:-1]
#reset other columns
print (df1.reset_index())
C       A      B  00:00  00:30       E
0  203704  WkDay   2015  0.247  0.2320
1  203704  WkDay   2016  0.280  0.2670
2  203704  Wkend   2015  0.102  0.0907
3  203704  Wkend   2016  0.263  0.2520

答案 1 :(得分:2)

使用set_indexunstack

df.set_index(['A', 'B', 'E', 'C']).D.unstack().reset_index()

enter image description here

如果你坚持确切的格式

df.set_index(['A', 'B', 'E', 'C']) \
    .D.unstack().reset_index() \
    .rename_axis(None, 1).iloc[:, [0, 1, 3, 4, 2]]

enter image description here