将多索引转换为行方式多维NumPy数组。

时间:2017-05-11 16:50:32

标签: python pandas numpy dataframe

假设我有一个类似于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)

1 个答案:

答案 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)