gpt4 book ai didi

python - 如何将 pandas MultiIndex DataFrame 转换为 3D 数组

转载 作者:太空狗 更新时间:2023-10-29 21:30:20 25 4
gpt4 key购买 nike

假设我有一个 MultiIndex DataFrame:

                                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

我想从这个 DataFrame 生成一个 3 维的 NumPy 数组,假设该 DataFrame 在主列中有 15 个类别,4 列和一个长度为 5 的时间索引。我想创建一个带有(4,15,5) 的形状分别表示 (columns, categories, time_index)

应该创建一个数组:

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 做到这一点:

panel = pd.Panel(items=[columns], major_axis=[categories], minor_axis=[time_index], dtype=np.float32)
...

如何使用多索引数据框最有效地完成此任务?谢谢

最佳答案

由于 df.values 是一个 (15*100, 4) 形的数组,您可以调用 reshape 使其成为 (15, 100, 4) 形数组:

arr = df.values.reshape(15, 100, 4)

然后调用transpose重新排列轴的顺序:

arr = arr.transpose(2, 0, 1)

现在 arr 的形状是 (4, 15, 100)


使用 reshape/transposeto_xarray().to_array() 快 960 倍:

In [21]: df = pd.DataFrame(np.random.randint(10, size=(15*100, 4)), index=pd.MultiIndex.from_product([range(15), range(100)], names=['A','B']), columns=list('colu'))

In [22]: %timeit arr = df.values.reshape(15, 100, 4).transpose(2, 0, 1)
3.31 µs ± 23.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [24]: %timeit df.to_xarray().to_array()
3.18 ms ± 24.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [25]: 3180/3.31
Out[25]: 960.7250755287009

关于python - 如何将 pandas MultiIndex DataFrame 转换为 3D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54615882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com