2012-09-22 116 views
2

假設我有一個DataFrame,它具有如下所示的子索引結構,'date','tenor''mat'和'strike',以及要被觀察的字段存儲在哪裏列「卷」:如何在熊貓數據框中組織結構化數據

date  tenor mat strike vol          
20120903 3m  1y 0.25  52. 
        0.50  51. 
        1.00  49. 
20120903 3m  5y 0.25  32. 
        0.50  55. 
        1.00  23. 
20120903 3m  10y 0.25  65. 
        0.50  55. 
        1.00  19. 
20120904 3m  1y 0.25  32. 
        0.50  57. 
        1.00  44. 
20120904 3m  5y 0.25  54. 
        0.50  50. 
        1.00  69. 
20120904 3m  10y 0.25  42. 
        0.50  81. 
        1.00  99. 

說,我想通過獲得與分類指數「日期」 +「男高音」一個新的數據幀,並通過「墊子」構成的三維數組給定「價值」來重組這個數據, '罷工'和'卷'從這樣的方式:

date  tenor values              
20120903 3m  [[1y,5y,10y],[0.25, 0.50, 1.00], [52., 51., 49.], 
                [32., 55., 23.], 
                [65., 55., 19.]] 
20120904 3m  [[1y,5y,10y],[0.25, 0.50, 1.00], [32., 57., 44.], 
                [54., 50., 69.], 
                [42., 81., 99.]] 

我試過各種嘗試'unpack','groupby'和'pivot',但沒有成功。我只能通過使用大量的Python矢量操作來實現我的目標,但這是一個緩慢而低效的過程。是否有任何特定的,更高效的熊貓程序,以獲得相同的結果?我迷路在這... 感謝您的幫助, 莫里吉奧

回答

3

怎麼是這樣的:

In [111]: df 
Out[111]: 
       mat strike vol 
date  tenor     
20120903 3m  1y 0.25 52 
     3m  1y 0.50 51 
     3m  1y 1.00 49 
     3m  5y 0.25 32 
     3m  5y 0.50 55 
     3m  5y 1.00 23 
     3m  10y 0.25 65 
     3m  10y 0.50 55 
     3m  10y 1.00 19 
20120904 3m  1y 0.25 32 
     3m  1y 0.50 57 
     3m  1y 1.00 44 
     3m  5y 0.25 54 
     3m  5y 0.50 50 
     3m  5y 1.00 69 
     3m  10y 0.25 42 
     3m  10y 0.50 81 
     3m  10y 1.00 99 

In [112]: def agg_func(x): 
    mats = list(x.mat.unique()) 
    strikes = list(x.strike.unique()) 
    vols = x.pivot('mat', 'strike', 'vol').reindex(mats, columns=strikes) 
    return [mats, strikes, vols.values.tolist()] 
    .....: 

In [113]: rs = df.groupby(level=['date', 'tenor']).apply(agg_func) 

In [114]: rs 
Out[114]: 
date  tenor 
20120903 3m  [['1y', '5y', '10y'], [0.25, 0.5, 1.0], [[52.0... 
20120904 3m  [['1y', '5y', '10y'], [0.25, 0.5, 1.0], [[32.0... 

In [115]: rs.values[0] 
Out[115]: 
[['1y', '5y', '10y'], 
[0.25, 0.5, 1.0], 
[[52.0, 51.0, 49.0], [32.0, 55.0, 23.0], [65.0, 55.0, 19.0]]] 
+0

昌您好,感謝您的回覆:最後一個問題,你是怎麼得到第一行中的'df'?我的意思是,你的看起來和我原來的看起來不一樣,因爲你原來似乎只有三列('墊''罷工'和'卷'),而我的只有'卷'值,其他人是索引 – mspadaccino

+1

我剛剛粘貼了你的代碼片段。你可以使用'set_index'或'reset_index'來創建索引列,反之亦然。我的df有一個帶有「日期」和「男高音」級別的MultiIndex。 –