Python 如何将多索引数据帧转换为3D数组

Python 如何将多索引数据帧转换为3D数组,python,arrays,pandas,numpy,Python,Arrays,Pandas,Numpy,假设我有一个多索引数据帧: c o l u major timestamp ONE 2019-01-22 18:12:00 0.00008 0.00008 0.00008 0.00008 2019-01-22 18:13:00 0.00008 0.00008 0.00008 0.00008

假设我有一个多索引数据帧:

                                c       o       l       u
major       timestamp                       
ONE         2019-01-22 18:12:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:13:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:14:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:15:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:16:00 0.00008 0.00008 0.00008 0.00008

TWO         2019-01-22 18:12:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:13:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:14:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:15:00 0.00008 0.00008 0.00008 0.00008 
            2019-01-22 18:16:00 0.00008 0.00008 0.00008 0.00008
我想从这个数据帧生成一个三维的NumPy数组,因为数据帧在主列中有15个类别,4个列,一个长度为5的时间索引。我想创建一个numpy数组,其形状为(4,15,5),分别表示(列、类别、时间索引)

应创建一个数组:

array([[[8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05],
        [8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05]],

       [[8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05],
        [8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05]],

       [[8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05],
        [8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05]],

       [[8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05],
        [8.e-05, 8.e-05, 8.e-05, 8.e-05, 8.e-05]]])
一个曾经能够通过pd面板实现这一点:

panel = pd.Panel(items=[columns], major_axis=[categories], minor_axis=[time_index], dtype=np.float32)
... 
我如何才能通过多索引数据帧最有效地实现这一点?
谢谢

因为
df.values
是一个
(15*100,4)
形状的数组,您可以调用
重塑
使其成为
(15,100,4)
形状的数组:

arr = df.values.reshape(15, 100, 4)
然后调用
transpose
重新排列轴的顺序:

arr = arr.transpose(2, 0, 1)
现在
arr
具有形状
(4,15100)


使用
重塑/转置
到阵列()快约960倍。到阵列()


使用
xarray
怎么样

res = df.to_xarray().to_array()
结果是一个形状数组(4,15,5)


事实上,这些文档现在是pandas
面板
的替代品。请注意,您必须安装
xarray
软件包。

如果短轴的长度不同,您可以尝试以下操作:

df.unstack().ffill().bfill().stack().values.reshape(*df.index.levshape,-1)

尽管如此,该面板仍然显得很尴尬,但为什么不推荐使用?

请注意,在某些情况下,对于大型数据帧,该方法可能会非常慢。我用一个有数百万个细胞的数据框做了这个尝试。根据我在列中使用的变量和在行中使用的变量,在一种情况下,时间为几秒钟,但在另一种情况下,我在大约20分钟后停止执行。这是迄今为止最好的解决方案。
to_xarray
函数在xarray 0.16.2中重新实现。现在它比以前快了几个数量级。请注意,这只适用于完全正交的情况,即当您有多个索引的所有组合,并且按正确的顺序排序时。Xarray速度慢得多,但也更健壮。to_Xarray函数在Xarray 0.16.2中重新实现。Panel被弃用,因为pandas背后的ppl只需要维护两个类,Dataframe和Series,而不是三个,他们认为多索引数据帧可以做Panel理论上可以做的任何事情(实际上,有一条学习曲线可以将面板操作映射到其等效的多索引数据帧操作)。
df.unstack().ffill().bfill().stack().values.reshape(*df.index.levshape,-1)