2015-01-02 43 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會爲我解決問題。感謝你們倆!! –

相關問題