假设我有一个类似于MultiIndex文档中示例的MultiIndex DataFrame。
>>> df
0 1 2 3
first second
bar one 0 1 2 3
two 4 5 6 7
baz one 8 9 10 11
two 12 13 14 15
foo one 16 17 18 19
two 20 21 22 23
qux one 24 25 26 27
two 28 29 30 31
我想从这个DataFrame生成一个NumPy数组,其数据结构为三维,例如
>>> desired_arr
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]],
[[16, 20],
[17, 21],
[18, 22],
[19, 23]],
[[24, 28],
[25, 29],
[26, 30],
[27, 31]]])
我该怎么做呢?
希望这里的情况很清楚 - 实际上我正在通过第一级对DataFrame进行解堆叠,然后尝试将结果中每个顶层的列MultiIndex转换为自己的二维数组。
我可以通过以下方式完成其中一半
>>> df.unstack(1)
0 1 2 3
second one two one two one two one two
first
bar 0 4 1 5 2 6 3 7
baz 8 12 9 13 10 14 11 15
foo 16 20 17 21 18 22 19 23
qux 24 28 25 29 26 30 27 31
但我现在正在苦恼如何将每一列转换成二维数组并将它们合并在一起,除了使用循环和列表明确地进行这样做外,我无法找到更好的方法。
我觉得应该有一种方法来预先指定所需 NumPy 数组的形状,用 np.nan
填充它,并使用特定的迭代顺序填充 DataFrame 的值,但是我还没有成功解决这个问题。
生成示例 DataFrame 的代码:
iterables = [['bar', 'baz', 'foo', 'qux'], ['one', 'two']]
ind = pd.MultiIndex.from_product(iterables, names=['first', 'second'])
df = pd.DataFrame(np.arange(8*4).reshape((8, 4)), index=ind)
[[[0, 4], [8, 12], [16, 20], .....
而不是横向移动而是按第二个多索引级别分组来形成3D数组。但我不能轻松地适应您的解决方案 - 您认为这是对问题的微不足道的改变,还是需要完全不同的解决方案? - Eric Hansen.transpose(2,0,1)
,而不是.swapaxes(1,2)
。 - Divakar