将Numpy数组转换为Pandas数据框的X Y坐标。

4

我有一个二维的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
...
2个回答

11

带有堆栈和重置索引:

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

1
谢谢!这很有帮助!您能不能将其推广到N维呢? - Firas

1
这是一个 NumPy 方法 -
>>> 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.shape 是 (3, 3),所以你的 x0 行应该是 [1, 2, 3]。但是你的代码输出的是第一列而不是行(从你的输出中可以看出,x0 = [1, 4, 7]...我知道问题陈述中显示了期望输出为 [1, 4, 7],但这并不是实际正确的坐标(@ayhan 搞对了)。 - WaveRider
@WaveRider 抱歉,我不太确定你想表达什么。你能再试一次吗?输出结果与ayhan相同,并且与问题中的预期输出也相同。 - Divakar
请看原始数组定义: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展示了两个。 - WaveRider
@WaveRider 根据预期的输出,似乎假设 Y 沿着输入数组的行(即第一行为 0,第二行为 1,以此类推),而 X 沿着列。因此,对于第一行,Y 不会改变,应该是 0。所以,对于 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接