假设我有一个类似于以下示例的 MultiIndex DataFrame多索引文档 http://pandas.pydata.org/pandas-docs/stable/advanced.html.
>>> 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 生成一个具有 3 维结构的 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)