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
保存了所需输出数组的上三角元素,对吗?