Pandas Dataframe或Panel to 3d numpy array

use*_*751 3 python numpy pandas

建立:

pdf = pd.DataFrame(np.random.rand(4,5), columns = list('abcde'))
pdf['a'][2:]=pdf['a'][0]
pdf['a'][:2]=pdf['a'][1]
pdf.set_index(['a','b'])
Run Code Online (Sandbox Code Playgroud)

输出:

                         c           d           e
a           b           
0.439502    0.115087     0.832546    0.760513    0.776555
            0.609107     0.247642    0.031650    0.727773
0.995370    0.299640     0.053523    0.565753    0.857235
            0.392132     0.832560    0.774653    0.213692
Run Code Online (Sandbox Code Playgroud)

每个数据系列按索引ID分组,ab表示其他功能的时间索引a.有没有办法让大熊猫产生反映a分组的numpy 3d数组?目前它将数据读取为二维pdf.shape输出(4, 5).我想要的是数组是变量形式:

array([[[-1.38655912, -0.90145951, -0.95106951,  0.76570984],
        [-0.21004144, -2.66498267, -0.29255182,  1.43411576],
        [-0.21004144, -2.66498267, -0.29255182,  1.43411576]],

       [[ 0.0768149 , -0.7566995 , -2.57770951,  0.70834656],
        [-0.99097395, -0.81592084, -1.21075386,  0.12361382]]])
Run Code Online (Sandbox Code Playgroud)

是否有本地Pandas方式来做到这一点?请注意,a实际数据中每个分组的行数是可变的,因此我不能只是转置或重塑pdf.values.如果没有本地方式,那么从数十万行和数百列迭代构建数组的最佳方法是什么?

Leo*_*Leo 9

我只是遇到了一个非常相似的问题,并解决了这个问题:

a3d = np.array(list(pdf.groupby('a').apply(pd.DataFrame.as_matrix)))
Run Code Online (Sandbox Code Playgroud)

输出:

array([[[ 0.47780308,  0.93422319,  0.00526572,  0.41645868,  0.82089215],
    [ 0.47780308,  0.15372096,  0.20948369,  0.76354447,  0.27743855]],

   [[ 0.75146799,  0.39133973,  0.25182206,  0.78088926,  0.30276705],
    [ 0.75146799,  0.42182369,  0.01166461,  0.00936464,  0.53208731]]])
Run Code Online (Sandbox Code Playgroud)

验证它是3d,a3d.shape给出(2,2,5).

最后,要使新创建的维度成为最后一个维度(而不是第一个维度),请使用:

a3d = np.dstack(list(pdf.groupby('a').apply(pd.DataFrame.as_matrix)))
Run Code Online (Sandbox Code Playgroud)

形状为(2,5,2)


Jef*_*eff 2

panel.values
Run Code Online (Sandbox Code Playgroud)

将直接返回一个numpy数组。这必然是可接受的最高数据类型,因为所有内容都被压缩到单个 3-d numpy 数组中。它将是 数组,而不是 pandas 数据的视图(无论数据类型如何)。