我有一个二维的numpy数组:
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
如何将此转换为一个pandas数据框,其中包含该索引处的x坐标,y坐标和相应数组值的pandas数据框?格式如下:
x y val
0 0 1
0 1 4
0 2 7
1 0 2
1 1 5
1 2 8
...
带有堆栈和重置索引:
df = pd.DataFrame(arr).stack().rename_axis(['y', 'x']).reset_index(name='val')
df
Out:
y x val
0 0 0 1
1 0 1 2
2 0 2 3
3 1 0 4
4 1 1 5
5 1 2 6
6 2 0 7
7 2 1 8
8 2 2 9
如果顺序很重要:
df.sort_values(['x', 'y'])[['x', 'y', 'val']].reset_index(drop=True)
Out:
x y val
0 0 0 1
1 0 1 4
2 0 2 7
3 1 0 2
4 1 1 5
5 1 2 8
6 2 0 3
7 2 1 6
8 2 2 9
>>> arr
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> shp = arr.shape
>>> r,c = np.indices(shp)
>>> pd.DataFrame(np.c_[r.ravel(), c.ravel(), arr.ravel('F')], \
columns=((['x','y','val'])))
x y val
0 0 0 1
1 0 1 4
2 0 2 7
3 1 0 2
4 1 1 5
5 1 2 8
6 2 0 3
7 2 1 6
8 2 2 9
arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
- 该数组的第一行是[1,2,3],相应的坐标x,y对是x0,y0=1,x0,y1=2,x0,y2=3。在您施加的转换之后,这些映射实际上变成了x0,y0=1,x0,y1=4,x0,y2=7,从而失去了原始坐标映射的完整性(问题描述正确地描述了映射x,y坐标,但问题描述中显示的期望结果显示了上述不正确的映射)。@ayhan展示了两个。 - WaveRider0
。所以,对于 arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
,我们应该有:x0,y0 = 1, x1,y0 = 2, and x2,y0 = 3
。如果您想要像 ayhan 显示的交换轴线输出,可以在我的解决方案中简单地删除 arr
的 Fortran 排序,即:pd.DataFrame(np.c_[r.ravel(), c.ravel(), arr.ravel()..
。希望这样能够澄清问题。 - Divakar