2016-10-26 6 views
3

У меня есть массив 2D NumPy из структур:Построить панду панель из 2D структурированного массива NumPy

arr = np.zeros((3,5), [('x',int), ('y',float)]) 

То есть:

array([[(0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0)], 
     [(0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0)], 
     [(0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0), (0, 0.0)]], 
     dtype=[('x', '<i8'), ('y', '<f8')]) 

Я хочу создать панду панель из него. Я попробовал очевидное:

pd.Panel(arr) 

ValueError: The number of dimensions required is 3, but the number of dimensions of the ndarray given was 2

Потом я обнаружил эту безобразную груду:

pd.Panel(dict(enumerate(pd.DataFrame(a) for a in arr))) 

Он производит:

<class 'pandas.core.panel.Panel'> 
Dimensions: 3 (items) x 5 (major_axis) x 2 (minor_axis) 
Items axis: 0 to 2 
Major_axis axis: 0 to 4 
Minor_axis axis: x to y 

Этот "работает", но очень неэффективно и уродство ,

Как такие панели должны быть построены?

Edit: я представил вопрос здесь: https://github.com/pandas-dev/pandas/issues/14511

+0

Какова конечная форма вы после? что-то вроде 'pd.Panel (arr.reshape ((1, arr.shape [0], arr.shape [1])))' или 'pd.Panel (arr.reshape ((arr.shape [0], arr .shape [1], 1))) '? – EdChum

+0

@EdChum: Окончательная форма, заданная отвратительной кучей, которую я написал в вопросе, в порядке. Код, который вы написали, создает Панели, но они полны NaN вместо данных из 'arr' !! Я обновлю вопрос, чтобы показать результаты отвратительной кучи. –

ответ

3

Вам нужно предоставить 3-D массив, соответствующий пункты, крупные и мелкие оси объекта панели.

# minor axis corresponds to the dtype names of the array initialized with zeros 
dtyp = np.array(arr.dtype.names) 
# dimensions to be included 
dim = arr.shape[0], arr.shape[1], dtyp.shape[0] 
# Flatten the array and reshape it according to the aforementioned dimensions 
panel = pd.Panel(pd.DataFrame(arr.ravel()).values.reshape(dim), minor_axis=dtyp) 

дает:

<class 'pandas.core.panel.Panel'> 
Dimensions: 3 (items) x 5 (major_axis) x 2 (minor_axis) 
Items axis: 0 to 2 
Major_axis axis: 0 to 4 
Minor_axis axis: x to y 

Чтобы преобразовать его в DF, просто использовать метод to_frame, например, так:

panel.to_frame() 

Image

Часы работы:

Image

+0

Ваш путь действительно быстрее, но он еще менее краток, чем мой оригинал. Вы отмечаете, что для панели требуется 3D-массив, но ясно, что это именно то, что представляет собой 2D структурированный массив. В конце концов, DataFrame может быть построен из 1D структурированного массива. Я думаю, это просто недостаток конструктора Panel. –

+0

Да, я согласен с этим. В настоящее время панельные объекты имеют низкую функциональность по сравнению с аналогами данных/рядов. В будущем должен быть способ справиться с построением массива с тремя осями. –

+0

Я только что понял другую проблему с вашим решением: он изменяет все типы элементов, чтобы плавать! Мне нужно сохранить исходные типы dtypes, потому что на практике я также использую bools, строки, datetimes и т. Д. –

Смежные вопросы