Python 将RCV转换为矩阵

Python 将RCV转换为矩阵,python,pandas,numpy,matrix,Python,Pandas,Numpy,Matrix,我有这样的数据 Row_idx Column_idx Value AA AA 1 AA BB 2 AA CC 3 BB BB 1 BB CC 4 CC CC 1 df=pd.DataFrame({'Row_idx':['AA','AA','AA','BB',

我有这样的数据

Row_idx    Column_idx    Value
AA         AA            1
AA         BB            2
AA         CC            3
BB         BB            1
BB         CC            4
CC         CC            1

df=pd.DataFrame({'Row_idx':['AA','AA','AA','BB','BB','CC'],'Column_idx':['AA','BB','CC','BB','CC','CC'],'Value':[1,2,3,1,4,1]})
表示协方差矩阵的上半部分

    AA    BB    CC
AA  1     2     3
BB        1     4
CC              1
我如何才能最有效地将数据再次放入完整的矩阵中。 数据从一个文件读入一个数据帧,并且有几十万行,因此我希望避免使用一些嵌套循环方法

最终我需要将其作为np数组

1    2    3
2    1    4
3    4    1
我在考虑使用numpy的triu包来完成矩阵,但是如何快速地将它从RCV数据帧转换到正确的行和列索引数据帧

df

  Column_idx Row_idx  Value
0         AA      AA      1
1         BB      AA      2
2         CC      AA      3
3         BB      BB      1
4         CC      BB      4
5         CC      CC      1
电话和:

在这种情况下,还可以执行()操作:

结果是一样的,因为你在处理一个三角形矩阵

电话和:

在这种情况下,还可以执行()操作:


最后得到相同的结果,因为你处理的是一个三角形矩阵。

看起来
Value
column holds是上面的三角形元素。因此,为了创建完整的矩阵/数组,我们可以使用一些掩蔽-

def full_tri(v): # v is array holding values to be assigned into o/p
    n = int(np.sqrt(len(v)*2)) # size of squared output array
    out = np.empty((n,n),dtype=v.dtype)
    r = np.arange(n)
    m = r[:,None] <= r
    out[m] = v
    out.T[m] = v
    return out  
运行时测试

其他办法-

# @cᴏʟᴅsᴘᴇᴇᴅ's soln
def pivot_fmax(df):
    x = df.pivot('Row_idx', 'Column_idx', 'Value').values
    return np.fmax(x, x.T)

# @B. M.'s soln
def pivot_fillna(df):
    M=df.pivot(*df.columns)
    M.fillna(M.T,inplace=True)
    return M.values
更大数据集上的计时-

In [791]: N = 1000 # size of testing dataset
     ...: r,c = np.triu_indices(N)
     ...: df = pd.DataFrame(np.c_[r,c,np.random.randint(11,99,(len(r)))])
     ...: df.columns = [['Row_idx', 'Column_idx', 'Value']]
     ...: 

In [792]: %timeit pivot_fmax(df)
     ...: %timeit pivot_fillna(df)
     ...: %timeit full_tri(df.Value.values)
     ...: 
10 loops, best of 3: 89.7 ms per loop
10 loops, best of 3: 96.5 ms per loop
100 loops, best of 3: 4.19 ms per loop

In [793]: N = 2000 # size of testing dataset
     ...: r,c = np.triu_indices(N)
     ...: df = pd.DataFrame(np.c_[r,c,np.random.randint(11,99,(len(r)))])
     ...: df.columns = [['Row_idx', 'Column_idx', 'Value']]
     ...: 

In [794]: %timeit pivot_fmax(df)
     ...: %timeit pivot_fillna(df)
     ...: %timeit full_tri(df.Value.values)
     ...: 
1 loop, best of 3: 412 ms per loop
1 loop, best of 3: 425 ms per loop
100 loops, best of 3: 18.6 ms per loop

似乎
Value
column holds是上面的三角形元素。因此,为了创建完整的矩阵/数组,我们可以使用一些掩蔽-

def full_tri(v): # v is array holding values to be assigned into o/p
    n = int(np.sqrt(len(v)*2)) # size of squared output array
    out = np.empty((n,n),dtype=v.dtype)
    r = np.arange(n)
    m = r[:,None] <= r
    out[m] = v
    out.T[m] = v
    return out  
运行时测试

其他办法-

# @cᴏʟᴅsᴘᴇᴇᴅ's soln
def pivot_fmax(df):
    x = df.pivot('Row_idx', 'Column_idx', 'Value').values
    return np.fmax(x, x.T)

# @B. M.'s soln
def pivot_fillna(df):
    M=df.pivot(*df.columns)
    M.fillna(M.T,inplace=True)
    return M.values
更大数据集上的计时-

In [791]: N = 1000 # size of testing dataset
     ...: r,c = np.triu_indices(N)
     ...: df = pd.DataFrame(np.c_[r,c,np.random.randint(11,99,(len(r)))])
     ...: df.columns = [['Row_idx', 'Column_idx', 'Value']]
     ...: 

In [792]: %timeit pivot_fmax(df)
     ...: %timeit pivot_fillna(df)
     ...: %timeit full_tri(df.Value.values)
     ...: 
10 loops, best of 3: 89.7 ms per loop
10 loops, best of 3: 96.5 ms per loop
100 loops, best of 3: 4.19 ms per loop

In [793]: N = 2000 # size of testing dataset
     ...: r,c = np.triu_indices(N)
     ...: df = pd.DataFrame(np.c_[r,c,np.random.randint(11,99,(len(r)))])
     ...: df.columns = [['Row_idx', 'Column_idx', 'Value']]
     ...: 

In [794]: %timeit pivot_fmax(df)
     ...: %timeit pivot_fillna(df)
     ...: %timeit full_tri(df.Value.values)
     ...: 
1 loop, best of 3: 412 ms per loop
1 loop, best of 3: 425 ms per loop
100 loops, best of 3: 18.6 ms per loop

要保留数据帧,只需执行以下操作:

M=df.pivot(*df.columns)
M.fillna(M.T,inplace=True)

# Column_idx   AA   BB   CC
# Row_idx                  
# AA          1.0  2.0  3.0
# BB          2.0  1.0  4.0
# CC          3.0  4.0  1.0

要保留数据帧,只需执行以下操作:

M=df.pivot(*df.columns)
M.fillna(M.T,inplace=True)

# Column_idx   AA   BB   CC
# Row_idx                  
# AA          1.0  2.0  3.0
# BB          2.0  1.0  4.0
# CC          3.0  4.0  1.0

或者只是
df.pivot(*df.columns)
@B.M.是的,这是一个有趣的替代方案,可以在这个特定的实例中工作,谢谢。或者只是
df.pivot(*df.columns)
@B.M.是的,这是一个有趣的替代方案,可以在这个特定的实例中工作,谢谢。
Value
保存了所需输出数组的上三角元素,对吗?
Value
保存了所需输出数组的上三角元素,对吗?