我有一个像这样创建的 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
答案 0 :(得分:2)
您可以ravel
和reshape
数组(或者只是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