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)