从二维结构化的NumPy数组构建Pandas面板

3

我有一个由结构体组成的二维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 Panel。我尝试了显而易见的方法:

pd.Panel(arr)

数值错误:所需维度数为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


你最终想要的形状是什么?类似于 pd.Panel(arr.reshape((1, arr.shape[0], arr.shape[1]))) 还是 pd.Panel(arr.reshape((arr.shape[0], arr.shape[1], 1))) - EdChum
@EdChum:我在问题中写的丑陋堆栈最终形状是可以的。你写的代码确实产生了面板,但它们充满了NaN而不是来自arr的数据!我将更新问题以显示丑陋堆栈的结果。 - John Zwinck
1个回答

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()

图片

时间:

图片


你的方法确实更快,但比我的原始方法还不够简洁。你提到Panel需要一个3D数组,但显然这正是2D结构化数组所具备的。毕竟,DataFrame可以从1D结构化数组构建而成。我猜这只是Panel构造函数的一个缺陷。 - John Zwinck
是的,我同意。目前面板对象与其数据框/系列对象相比功能较少。未来必须有一种方法来处理三维numpy数组构建。 - Nickil Maveli
我刚刚意识到你的解决方案还有另一个问题:它将所有项目类型都更改为浮点数!我需要保留原始数据类型,因为在实践中我还使用布尔值、字符串、日期时间等。 - John Zwinck
该行为是合理的,因为从您的起始数组构建的面板对象在同一列中包含intfloat值(由于次轴创建的多索引)。在这种情况下,由于类型的混合,dtypes将被推断为浮点数。因此,所有项目轴的dtypes都是float64。同时,在使用原始函数时也观察到了相同的行为。 - Nickil Maveli
1
事实证明,这种行为根本就没有道理。如果您查看我在GitHub上发布的问题的响应(并在问题中添加了链接),您将看到Pandas的维护者表示Panel已被弃用且不再维护,而且人们应该转向xarray(这是一个与Pandas完全不同的库)。真是奇怪。 - John Zwinck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接