Numpy Pivot 到数据框但保留索引

时间:2021-01-27 17:49:30

标签: python pandas numpy

我有一个像这样创建的 numpy 数组

npyieldData = np.empty((noScans,4, 3), dtype=float)

一旦填充,我想将其展平为具有这样布局的数据框。 我将 x 用于第一维(noScans),y 用于第二维(0-3),z 用于第三维(0-2)

Col_X        Col_Y         Col_Z0         Col_Z2         Col_Z3
-----        -----         ------         ------         ------ 
X-0_Value    Y-0-0_Value   Z-0-0-0_Value  Z-0-0-1_Value  Z0-0-2_Value
X-0_Value    Y-0-1_Value   Z-0-1-0_Value  Z-0-1-1_Value  Z0-1-2_Value

这是一个小数组作为示例

demo = np.empty((2, 2, 3), dtype=float)

demo[0,0] = [1,2,3]
demo[0,1] = [4,5,6]
demo[1,0] = [7,8,9]
demo[1,1] = [10,11,12]

想要的结果是

Col1 Col2 Col3 Col4 Col5
---- ---- ---- ---- ----
   0    0    1    2    3
   0    1    4    5    6
   1    0    7    8    9
   1    1   10   11   12

2 个答案:

答案 0 :(得分:2)

您可以ravelreshape 数组(或者只是vstack,正如sammywemmy 指出的那样),然后根据形状的乘积创建前两列作为索引.然后重置索引并手动重命名列。

x,y,z = demo.shape
df = (pd.DataFrame(demo.ravel().reshape((x*y, z)),
                   index=pd.MultiIndex.from_product([range(x), range(y)]))
        .reset_index())
df.columns = [f'Col{i+1}' for i in range(df.columns.size)]

   Col1  Col2  Col3  Col4  Col5
0     0     0   1.0   2.0   3.0
1     0     1   4.0   5.0   6.0
2     1     0   7.0   8.0   9.0
3     1     1  10.0  11.0  12.0

答案 1 :(得分:1)

独立构建维度框架和演示框架,连接并生成新的列名

dimensions = (pd.DataFrame(np.argwhere(demo)[:, :-1])
              .drop_duplicates(ignore_index=True))
dimensions

    0   1
0   0   0
1   0   1
2   1   0
3   1   1

demo_frame = pd.DataFrame(np.vstack(demo))
demo_frame

      0     1       2
0   1.0     2.0     3.0
1   4.0     5.0     6.0
2   7.0     8.0     9.0
3   10.0    11.0    12.0

demo_frame = pd.concat([dimensions, demo_frame], axis="columns")
# same idea as @ALollz's
demo_frame.columns = [f"Col{i+1}" for i in range(demo_frame.columns.size)]
demo_frame


    Col1    Col2    Col3    Col4    Col5
0     0       0     1.0     2.0     3.0
1     0       1     4.0     5.0     6.0
2     1       0     7.0     8.0     9.0
3     1       1     10.0    11.0    12.0