从2D结构化NumPy数组

时间:2016-10-26 09:51:47

标签: pandas numpy panel-data

我有一个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')])

我想从中创建一个Pandas面板。我尝试了显而易见的事实:

pd.Panel(arr)
  

ValueError:所需的维数为3,但给出的ndarray的维数为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

这“有效”,但效率很低,而且是一种眼睛。

这些小组是如何构建的?

修改:我在此处提交了一个问题:https://github.com/pandas-dev/pandas/issues/14511

1 个答案:

答案 0 :(得分:3)

您需要提供与面板对象的项目,主轴和次轴相对应的三维数组。

# 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