【问题标题】:Create 2D array from Pandas dataframe从 Pandas 数据框创建二维数组
【发布时间】:2016-02-18 14:39:15
【问题描述】:

可能是一个非常简单的问题,但我想不出一个解决方案。 我有一个包含 9 列和 ~100000 行的数据框。数据是从图像中提取的,因此两列(“行”和“列”)指的是数据的像素位置。如何创建一个 numpy 数组 A 以使行和列指向另一列中的另一个数据条目,例如“脾气暴躁”?

A[row, col]
#  0.1232

我想避免 for 循环或类似的东西。

【问题讨论】:

    标签: python numpy pandas vectorization


    【解决方案1】:

    你可以这样做 -

    # Extract row and column information
    rowIDs = df['row']
    colIDs = df['col']
    
    # Setup image array and set values into it from "grumpiness" column
    A = np.zeros((rowIDs.max()+1,colIDs.max()+1))
    A[rowIDs,colIDs] = df['grumpiness']
    

    示例运行 -

    >>> df
       row  col  grumpiness
    0    5    0    0.846412
    1    0    1    0.703981
    2    3    1    0.212358
    3    0    2    0.101585
    4    5    1    0.424694
    5    5    2    0.473286
    >>> A
    array([[ 0.        ,  0.70398113,  0.10158488],
           [ 0.        ,  0.        ,  0.        ],
           [ 0.        ,  0.        ,  0.        ],
           [ 0.        ,  0.21235838,  0.        ],
           [ 0.        ,  0.        ,  0.        ],
           [ 0.84641194,  0.42469369,  0.47328598]])
    

    【讨论】:

      【解决方案2】:

      一个非常快速和直接的方法是使用pivot_table

      >>> df
         row  col  grumpiness
      0    5    0    0.846412
      1    0    1    0.703981
      2    3    1    0.212358
      3    0    2    0.101585
      4    5    1    0.424694
      5    5    2    0.473286
      
      >>> df.pivot_table('grumpiness', 'row', 'col', fill_value=0)
      col         0         1         2
      row                              
      0    0.000000  0.703981  0.101585
      3    0.000000  0.212358  0.000000
      5    0.846412  0.424694  0.473286
      

      请注意,如果缺少任何完整的行/列,它将把它们排除在外,如果任何行/列对重复,它将平均结果。也就是说,对于较大的数据集,这通常会比基于索引的方法快得多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-27
        • 1970-01-01
        • 1970-01-01
        • 2023-01-04
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        相关资源
        最近更新 更多