2014-05-05 89 views
1

設置:熊貓數據幀或面板到3d numpy的陣列

pdf = pd.DataFrame(np.random.rand(4,5), columns = list('abcde')) 
pdf['a'][2:]=pdf['a'][0] 
pdf['a'][:2]=pdf['a'][1] 
pdf.set_index(['a','b']) 

輸出:

      c   d   e 
a   b   
0.439502 0.115087  0.832546 0.760513 0.776555 
      0.609107  0.247642 0.031650 0.727773 
0.995370 0.299640  0.053523 0.565753 0.857235 
      0.392132  0.832560 0.774653 0.213692 

每個數據系列是由索引ID分組ab表示的其他功能的時間索引a。有沒有辦法讓熊貓產生一個反映a分組的排列的3d陣列?目前它將數據讀取爲二維,因此pdf.shape輸出(4, 5)。我想是的數組是可變的形式:

array([[[-1.38655912, -0.90145951, -0.95106951, 0.76570984], 
     [-0.21004144, -2.66498267, -0.29255182, 1.43411576], 
     [-0.21004144, -2.66498267, -0.29255182, 1.43411576]], 

     [[ 0.0768149 , -0.7566995 , -2.57770951, 0.70834656], 
     [-0.99097395, -0.81592084, -1.21075386, 0.12361382]]]) 

是否有本地熊貓辦法做到這一點?請注意,實際數據中每a分組的行數是可變的,所以我不能只是轉置或重塑pdf.values。如果沒有本地方法,迭代構建數十萬行和數百列數組的最佳方法是什麼?

+0

有你看着一個形狀通過...分組?它可以根據列或索引級別對子集執行操作,並且大多數情況下可以避免使用ND數組,其中N> 2 –

+0

是的,我可以使用pdf.groupby(level = 1)並獲取我可以使用的groupby對象操作;不過,我需要將所有內容輸出到numpy數組中。這是Pandas管道中的最後一步,下一個需要如上所述的陣列。 – user2805751

回答

1
panel.values 

將直接返回一個numpy數組。這將是必然的最高可接受的dtype,因爲一切都被揉成單個三維numpy陣列。它將是新的數組,而不是熊貓數據的視圖(不管dtype)。

4

我只是有一個非常類似的問題,解決它像這樣:

a3d = np.array(list(pdf.groupby('a').apply(pd.DataFrame.as_matrix))) 

輸出:

array([[[ 0.47780308, 0.93422319, 0.00526572, 0.41645868, 0.82089215], 
    [ 0.47780308, 0.15372096, 0.20948369, 0.76354447, 0.27743855]], 

    [[ 0.75146799, 0.39133973, 0.25182206, 0.78088926, 0.30276705], 
    [ 0.75146799, 0.42182369, 0.01166461, 0.00936464, 0.53208731]]]) 

驗證它是3D,a3d.shape給出(2,2,5)。

最後,爲了使新創建維度的最後一個維度(而不是第一),然後使用:

a3d = np.dstack(list(pdf.groupby('a').apply(pd.DataFrame.as_matrix))) 

其中有(2,5,2)