2016-03-26 81 views
2

假設我們有有效地創建一個熊貓數據幀從numpy的三維陣列

import numpy as np 
a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) 

這怎麼可能有效地製作成大熊貓數據幀相當於

import pandas as pd 
>>> pd.DataFrame({'a': [0, 0, 1, 1], 'b': [1, 3, 5, 7], 'c': [2, 4, 6, 8]}) 

    a b c 
0 0 1 2 
1 0 3 4 
2 1 5 6 
3 1 7 8 

的想法開始是有a列在原始數組中具有第一維中的索引,而其餘列則是原始數組中後兩維中2d數組的垂直連接。

(這是很容易與循環做,問題是怎麼做的沒有他們。)


長一點的示例

使用@ Divakar的指教:

>>> np.random.randint(0,9,(4,3,2)) 
array([[[0, 6], 
    [6, 4], 
    [3, 4]], 

    [[5, 1], 
    [1, 3], 
    [6, 4]], 

    [[8, 0], 
    [2, 3], 
    [3, 1]], 

    [[2, 2], 
    [0, 0], 
    [6, 3]]]) 

應該是這樣的:

>>> pd.DataFrame({ 
    'a': [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3], 
    'b': [0, 6, 3, 5, 1, 6, 8, 2, 3, 2, 0, 6], 
    'c': [6, 4, 4, 1, 3, 4, 0, 3, 1, 2, 0, 3]}) 
    a b c 
0 0 0 6 
1 0 6 4 
2 0 3 4 
3 1 5 1 
4 1 1 3 
5 1 6 4 
6 2 8 0 
7 2 2 3 
8 2 3 1 
9 3 2 2 
10 3 0 0 
11 3 6 3 
+0

對於那個樣本,我們不應該有''b':[1,3,5,7]嗎?另外,你可以添加另一個樣本,比如'a = np.random.randint(0,9,(4,3,2))',看看維度長度不同時會發生什麼? – Divakar

+0

@Divakar感謝您的出色評論! –

回答

2

使用Panel

a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) 
b=pd.Panel(rollaxis(a,2)).to_frame() 
c=b.set_index(b.index.labels[0]).reset_index() 
c.columns=list('abc') 

然後a是:

[[[1 2] 
    [3 4]] 

[[5 6] 
    [7 8]]] 

b是:

   0 1 
major minor  
0  0  1 2 
     1  3 4 
1  0  5 6 
     1  7 8 

c和爲:

a b c 
0 0 1 2 
1 0 3 4 
2 1 5 6 
3 1 7 8 
3

這裏有一個方法,做最對NumPy的處理終於把它作爲一個數據幀,像這樣前 -

m,n,r = a.shape 
out_arr = np.column_stack((np.repeat(np.arange(m),n),a.reshape(m*n,-1))) 
out_df = pd.DataFrame(out_arr) 

如果你恰恰知道列數將2,這樣我們將有bc作爲最後的兩列a作爲第一位的,你可以添加列名像這樣 -

out_df = pd.DataFrame(out_arr,columns=['a', 'b', 'c']) 

採樣運行 -

>>> a 
array([[[2, 0], 
     [1, 7], 
     [3, 8]], 

     [[5, 0], 
     [0, 7], 
     [8, 0]], 

     [[2, 5], 
     [8, 2], 
     [1, 2]], 

     [[5, 3], 
     [1, 6], 
     [3, 2]]]) 
>>> out_df 
    a b c 
0 0 2 0 
1 0 1 7 
2 0 3 8 
3 1 5 0 
4 1 0 7 
5 1 8 0 
6 2 2 5 
7 2 8 2 
8 2 1 2 
9 3 5 3 
10 3 1 6 
11 3 3 2 
+0

謝謝!這很有效。雖然,我用x,y,z替換了m,n,r。 –

相關問題