给定索引矩阵和原始数据,如何快速重建新的数据帧



我有一个数据框和一个与数据框对应的索引表。要创建新的数据框,是否有其他方法可以重建新数据。索引表中的行索引实际上是行号,所以在python意义上,实际的行索引=行号-1。

    # simulate index table
    col_index=np.random.choice([0,1], 5, p=[0.4, 0.6])
    row_index=np.random.choice([3,1,2],5, p=[0.4, 0.5,0.1])
    ind=np.vstack((row_index,col_index))
    ind=ind.T
    array([[3, 0],
   [3, 1],
   [2, 1],
   [1, 1],
   [1, 0]])
    dt=np.random.random((5, 2)) #simulated data
    array([[ 0.3592,  0.4983],
       [ 0.0518,  0.2291],
       [ 0.4322,  0.5654],
       [ 0.8482,  0.1722],
       [ 0.1448,  0.5766]])
    # My code
    newDt=np.zeros([5,1])
    for j in range(5):
        row=ind[j,0]
        col=ind[j,1]
        newDt[j]=dt[row-1,col]
    #output
    array([[ 0.4322],
       [ 0.5654],
       [ 0.2291],
       [ 0.4983],
       [ 0.3592]])

假设您有一些值,vals 和一些索引,ind

>>> vals
array([[ 0.3592,  0.4983],
       [ 0.0518,  0.2291],
       [ 0.4322,  0.5654],
       [ 0.8482,  0.1722],
       [ 0.1448,  0.5766]])
>>> ind
array([[3, 0],
       [3, 1],
       [2, 1],
       [1, 1],
       [1, 0]])

获取所需内容的最简单方法是使用多维索引:

>>> vals[ind[:,0] - 1, ind[:,1]]
array([ 0.4322,  0.5654,  0.2291,  0.4983,  0.3592])

如果,正如您的问题似乎暗示的那样,您的值位于pd.DataFrame中,那么您可以访问 values 属性以使用底层np.array

>>> df
        0       1
0  0.3592  0.4983
1  0.0518  0.2291
2  0.4322  0.5654
3  0.8482  0.1722
4  0.1448  0.5766
>>> df.values[ind[:,0] - 1, ind[:,1]]
array([ 0.4322,  0.5654,  0.2291,  0.4983,  0.3592])

最新更新