gpt4 book ai didi

python - 将具有 n 级层次索引的 Pandas DataFrame 转换为 n-D Numpy 数组

转载 作者:太空狗 更新时间:2023-10-29 23:58:10 24 4
gpt4 key购买 nike

问题

有没有一种好方法可以将具有 n 级索引的 DataFrame 转换为 n-D Numpy 数组(又名 n-张量)?


例子

假设我设置了一个像这样的 DataFrame

from pandas import DataFrame, MultiIndex

index = range(2), range(3)
value = range(2 * 3)
frame = DataFrame(value, columns=['value'],
index=MultiIndex.from_product(index)).drop((1, 0))
print frame

哪些输出

     value
0 0 0
1 1
2 3
1 1 5
2 6

该索引是一个 2 级层次索引。我可以使用

从数据中提取二维 Numpy 数组
print frame.unstack().values

哪些输出

[[  0.   1.   2.]
[ nan 4. 5.]]

这如何推广到 n 级索引?

玩转unstack(),好像只能用来按摩DataFrame的二维形状,不能加轴。

我不能使用例如frame.values.reshape(x, y, z),因为这将要求框架恰好包含 x * y * z 行,这是无法保证的。这就是我试图通过 drop() 在上面的示例中插入一行来演示的内容。

非常感谢任何建议。

最佳答案

编辑。这种方法比我在下面给出的方法更优雅(并且快两个数量级)。

# create an empty array of NaN of the right dimensions
shape = map(len, frame.index.levels)
arr = np.full(shape, np.nan)

# fill it using Numpy's advanced indexing
arr[frame.index.codes] = frame.values.flat
# ...or in Pandas < 0.24.0, use
# arr[frame.index.labels] = frame.values.flat

原始解决方案。给定与上述类似的设置,但在 3-D 中,

from pandas import DataFrame, MultiIndex
from itertools import product

index = range(2), range(2), range(2)
value = range(2 * 2 * 2)
frame = DataFrame(value, columns=['value'],
index=MultiIndex.from_product(index)).drop((1, 0, 1))
print(frame)

我们有

       value
0 0 0 0
1 1
1 0 2
1 3
1 0 0 4
1 0 6
1 7

现在,我们继续使用 reshape() 路线,但进行一些预处理以确保沿每个维度的长度一致。

首先,使用所有维度的完整笛卡尔积重新索引数据框。 NaN 值将根据需要插入。此操作可能既慢又消耗大量内存,具体取决于维数和数据框的大小。

levels = map(tuple, frame.index.levels)
index = list(product(*levels))
frame = frame.reindex(index)
print(frame)

哪些输出

       value
0 0 0 0
1 1
1 0 2
1 3
1 0 0 4
1 NaN
1 0 6
1 7

现在,reshape() 将按预期工作。

shape = map(len, frame.index.levels)
print(frame.values.reshape(shape))

哪些输出

[[[  0.   1.]
[ 2. 3.]]

[[ 4. nan]
[ 6. 7.]]]

(相当丑陋的)一行是

frame.reindex(list(product(*map(tuple, frame.index.levels)))).values\
.reshape(map(len, frame.index.levels))

关于python - 将具有 n 级层次索引的 Pandas DataFrame 转换为 n-D Numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35047882/

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