2015-01-02 39 views
3

将pandas DataFrame从宽格式转换为堆叠/记录/数据库/长格式的最佳方式是什么?将pandas DataFrame重整为堆叠/记录/数据库/长格式

这里是一个小的代码示例:

宽格式:

date  hour1 hour2 hour3 hour4 
2012-12-31 9.18 -0.10 -7.00 -64.92 
2012-12-30 13.91 0.09 -0.96 0.08 
2012-12-29 12.97 11.82 11.65 10.20 
2012-12-28 22.01 16.04 15.68 11.67 
2012-12-27 11.44 0.07 -19.97 -67.98 
... 

叠放/记录/数据库/长格式(需要):

date     hour     price 
2012-12-31 00:00:00 hour1     9.18 
2012-12-31 00:00:00 hour2     -0.1 
2012-12-31 00:00:00 hour3      -7 
2012-12-31 00:00:00 hour4     -64.92 
... 
2012-12-30 00:00:00 hour1     7.18 
2012-12-30 00:00:00 hour2     -1.1 
2012-12-30 00:00:00 hour3      -9 
2012-12-30 00:00:00 hour4     -74.91 
... 

回答

7

您可以使用melt转换一个从宽格式到长格式的数据帧:

import pandas as pd 
df = pd.DataFrame({'date': ['2012-12-31', '2012-12-30', '2012-12-29', '2012-12-28', '2012-12-27'], 
        'hour1': [9.18, 13.91, 12.97, 22.01, 11.44], 
        'hour2': [-0.1, 0.09, 11.82, 16.04, 0.07]}) 
print pd.melt(df, id_vars=['date'], value_vars=['hour1', 'hour2'], var_name='hour', value_name='price') 

输出:

  date hour price 
0 2012-12-31 hour1 9.18 
1 2012-12-30 hour1 13.91 
2 2012-12-29 hour1 12.97 
3 2012-12-28 hour1 22.01 
4 2012-12-27 hour1 11.44 
5 2012-12-31 hour2 -0.10 
6 2012-12-30 hour2 0.09 
7 2012-12-29 hour2 11.82 
8 2012-12-28 hour2 16.04 
9 2012-12-27 hour2 0.07 
+0

工程就像魅力:)谢谢! –

2

你可以使用stack转动数据框。首先设置date为索引列:

>>> df.set_index('date').stack() 
date    
2012-12-31 hour1  9.18 
      hour2  -0.10 
      hour3  -7.00 
      hour4 -64.92 
2012-12-30 hour1  13.91 
      hour2  0.09 
      hour3  -0.96 
      hour4  0.08 
... 

这实际上返回了多指标一个系列。要创建一个您指定的DataFrame,您可以在堆叠和重命名列之后重置MultiIndex:

>>> stacked = df.set_index('date').stack() 
>>> df2 = stacked.reset_index() 
>>> df2.columns = ['date', 'hour', 'price'] 
>>> df2 
      date hour price 
0 2012-12-31 hour1 9.18 
1 2012-12-31 hour2 -0.10 
2 2012-12-31 hour3 -7.00 
3 2012-12-31 hour4 -64.92 
4 2012-12-30 hour1 13.91 
5 2012-12-30 hour2 0.09 
6 2012-12-30 hour3 -0.96 
7 2012-12-30 hour4 0.08 
... 
+0

我已经尝试使用stack()函数,但不知道重设MultiIndex会为我解决问题。感谢你们俩!! –

相关问题