2017-04-15 16 views
1

私は3次元numpy配列(z, x, y)を持っています。 zは時間次元であり、xyは座標です。3次元numpy配列からmultiindex pandasデータフレーム

これをマルチインデックス化pandas.DataFrameに変換します。行インデックスをz次元の とし、各列に固有のx、y座標からの値を持たせたい(したがって、各列は複数のインデックスが付けられます)。

最も単純なケース(ないマルチインデックス付き):

>>> array.shape 
(500L, 120L, 100L) 

>>> df = pd.DataFrame(array[:,0,0]) 

>>> df.shape 
(500, 1) 

私はpd.MultiIndex.from_arraysを使用してマルチインデックスデータフレームに配列全体を渡すようにしようとしてきたが、私はエラーを取得しています: NotImplementedError:> 1 ndimカテゴリは現時点ではサポートされていません

かなりシンプルなはずですが、私はそれを理解できません。

答えて

1

私はあなたがpanelを使用することができると思う - と、その後Multiindex DataFrameためto_frameを追加します。また、

np.random.seed(10) 
arr = np.random.randint(10, size=(5,3,2)) 
print (arr) 
[[[9 4] 
    [0 1] 
    [9 0]] 

[[1 8] 
    [9 0] 
    [8 6]] 

[[4 3] 
    [0 4] 
    [6 8]] 

[[1 8] 
    [4 1] 
    [3 6]] 

[[5 3] 
    [9 6] 
    [9 1]]] 

df = pd.Panel(arr).to_frame() 
print (df) 
      0 1 2 3 4 
major minor    
0  0  9 1 4 1 5 
     1  4 8 3 8 3 
1  0  0 9 0 4 9 
     1  1 0 4 1 6 
2  0  9 8 6 3 9 
     1  0 6 8 6 1 

transpose役立つことができます:

df = pd.Panel(arr).transpose(1,2,0).to_frame() 
print (df) 
      0 1 2 
major minor   
0  0  9 0 9 
     1  1 9 8 
     2  4 0 6 
     3  1 4 3 
     4  5 9 9 
1  0  4 1 0 
     1  8 0 6 
     2  3 4 8 
     3  8 1 6 
     4  3 6 1 

concatともう1つの可能な解決策:

arr = arr.transpose(1,2,0) 
df = pd.concat([pd.DataFrame(x) for x in arr], keys=np.arange(arr.shape[2])) 
print (df) 
    0 1 2 3 4 
0 0 9 1 4 1 5 
    1 4 8 3 8 3 
1 0 0 9 0 4 9 
    1 1 0 4 1 6 
2 0 9 8 6 3 9 
    1 0 6 8 6 1 

np.random.seed(10) 
arr = np.random.randint(10, size=(500,120,100)) 
df = pd.Panel(arr).transpose(2,0,1).to_frame() 
print (df.shape) 
(60000, 100) 

print (df.index.max()) 
(499, 119) 
+0

ありがとう:

はここにいくつかのサンプルコードです!これは近づいています。しかし、データの形状が正しくない、私は500行( "メジャー"として)と0と1あなたの最初の例ではマイナーとして探しています。しかし、私は代わりに500列を取得しています。私は転置の異なる順列を試みましたが、それでもかなり正しくはありません。 – BioProg

+0

minor、 '100'または' 120'カラムでmajor、 '120'または' 100'の '500'行が必要ですか? – jezrael

+0

は '120'列の場合に '.transpose(1,0,2)'を必要とするかもしれません。 – jezrael

0

私はSeries with a Multiindexが任意の次元(おそらく3以上)を持つnumpy配列の最も類似したpandasデータ型であることがわかりました。

import pandas as pd 
import numpy as np 

time_vals = np.linspace(1, 50, 50) 
x_vals = np.linspace(-5, 6, 12) 
y_vals = np.linspace(-4, 5, 10) 

measurements = np.random.rand(50,12,10) 

#setup multiindex 
mi = pd.MultiIndex.from_product([time_vals, x_vals, y_vals], names=['time', 'x', 'y']) 

#connect multiindex to data and save as multiindexed Series 
sr_multi = pd.Series(index=mi, data=measurements.flatten()) 

#pull out a dataframe of x, y at time=22 
sr_multi.xs(22, level='time').unstack(level=0) 

#pull out a dataframe of y, time at x=3 
sr_multi.xs(3, level='x').unstack(level=1)