2017-04-15 2 views
1

나는 배열이 3 차원 numpy(z, x, y)입니다. z은 시간 차원이며 xy은 좌표입니다.3 차원 numpy 배열에서 다중 색인 팬더 데이터 프레임

이 항목을 멀티 인덱스화된 pandas.DataFrame으로 변환하고 싶습니다. 행 인덱스를 z 차원 으로 만들고 각 열에 고유 한 x, y 좌표 값이 있어야합니다. 따라서 각 열은 다중 인덱스가됩니다.

가장 간단한 경우 (멀티 인덱스되지 않음) : 나는 pd.MultiIndex.from_arrays를 사용하여 multiindex dataframe에 전체 배열을 전달하려고 노력했지만 나는 오류를 받고 있어요

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

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

>>> df.shape 
(500, 1) 

: 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 또 다른 가능한 해결책 :

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 행 ("major"로)과 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 배열의 가장 유사한 유사 판다 데이터 유형이라는 것을 알았습니다.

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) 
관련 문제