我有一个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
答案 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()
<强> 时序: 强>