假设我有一个类似于MultiIndex docs中的示例的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 :(得分:0)
完成@divakar 的回答,用于多维概括:
# sort values by index
A = df.sort_index()
# fill na
for idx in A.index.names:
A = A.unstack(idx).fillna(0).stack(1)
# create a tuple with the rights dimensions
reshape_size = tuple([len(x) for x in A.index.levels])
# reshape
arr = np.reshape(A.values, reshape_size ).swapaxes(0,1)