【问题标题】:Numpy Array to Pandas Data Frame of X Y CoordinatesNumpy 数组到 X Y 坐标的 Pandas 数据框
【发布时间】:2017-05-22 15:54:00
【问题描述】:

我有一个二维 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
...

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    带有堆栈和重置索引:

    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
    

    【讨论】:

    • 谢谢 - 这很有帮助!您有没有机会将其推广到 N 维?
    【解决方案2】:

    这是一个 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 对不起,我不太确定你想说什么。你能再试一次吗?输出与 ayhan 相同,也与问题中的预期输出相同。
    • 当然,请看原始数组定义: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 我将通过那里的预期输出,它似乎假设 Y 沿着输入数组的行(即 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()..。希望澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    相关资源
    最近更新 更多