Python 使用第二个数据帧wrt第一个数据帧中形成的新行创建矩阵
我想创建一个矩阵,矩阵中的1表示在第二个数据帧中形成的新行。 例如,-2 4是一行,它位于两个数据帧中,因此在矩阵中我们将矩阵[2,4]=0和[4,2]=0,因为关系是双向的 2) 14是第二个数据帧中的新行,它不在第一个数据帧中,因此我们将矩阵[1,4]=1和[4,1]=1 3) 如果组合在两个dfs中都不像[3,4],则其矩阵[3,4]=矩阵[4,3]=0 预期产出:Python 使用第二个数据帧wrt第一个数据帧中形成的新行创建矩阵,python,pandas,dataframe,matrix,Python,Pandas,Dataframe,Matrix,我想创建一个矩阵,矩阵中的1表示在第二个数据帧中形成的新行。 例如,-2 4是一行,它位于两个数据帧中,因此在矩阵中我们将矩阵[2,4]=0和[4,2]=0,因为关系是双向的 2) 14是第二个数据帧中的新行,它不在第一个数据帧中,因此我们将矩阵[1,4]=1和[4,1]=1 3) 如果组合在两个dfs中都不像[3,4],则其矩阵[3,4]=矩阵[4,3]=0 预期产出: data1 = { 'node1': [1,1,1,2], 'node2': [2,3,5,4], 'w
data1 = { 'node1': [1,1,1,2],
'node2': [2,3,5,4],
'weight': [1,1,1,1], }
df1 = pd.DataFrame(data1, columns = ['node1','node2','weight'])
data2 = { 'node1': [1,1,2,3],
'node2': [4,5,4,5],
'weight': [1,1,1,1], }
df2= pd.DataFrame(data2, columns = ['node1','node2','weight'])
使用
node*
列作为numpy
数组的索引器,可以非常轻松地完成此操作
0 0 0 1 0
0 0 0 0 0
0 0 0 0 1
1 0 0 0 0
0 0 1 0 0
如果要在数据帧中输出,请调用
dataframe
构造函数:
# Adapting Divakar's answer to my question here (with thanks)
# https://stackoverflow.com/a/46990063/4909087
m = pd.concat([df1, df2]).max().max()
v = np.zeros((m, m))
idx1 = df2.iloc[:, :-1].values - 1
idx2 = df1.iloc[:, :-1].values - 1
v[tuple(np.r_[idx1,idx1[:,::-1]].T)] = 1
v[tuple(np.r_[idx2,idx2[:,::-1]].T)] = 0
v
array([[ 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 1.],
[ 1., 0., 0., 0., 0.],
[ 0., 0., 1., 0., 0.]])
使用
node*
列作为numpy
数组的索引器,可以非常轻松地完成此操作
0 0 0 1 0
0 0 0 0 0
0 0 0 0 1
1 0 0 0 0
0 0 1 0 0
如果要在数据帧中输出,请调用
dataframe
构造函数:
# Adapting Divakar's answer to my question here (with thanks)
# https://stackoverflow.com/a/46990063/4909087
m = pd.concat([df1, df2]).max().max()
v = np.zeros((m, m))
idx1 = df2.iloc[:, :-1].values - 1
idx2 = df1.iloc[:, :-1].values - 1
v[tuple(np.r_[idx1,idx1[:,::-1]].T)] = 1
v[tuple(np.r_[idx2,idx2[:,::-1]].T)] = 0
v
array([[ 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 1.],
[ 1., 0., 0., 0., 0.],
[ 0., 0., 1., 0., 0.]])
通过使用
pandas
pd.DataFrame(v, np.arange(m) + 1, np.arange(m) + 1, dtype=int)
1 2 3 4 5
1 0 0 0 1 0
2 0 0 0 0 0
3 0 0 0 0 1
4 1 0 0 0 0
5 0 0 1 0 0
通过使用
pandas
pd.DataFrame(v, np.arange(m) + 1, np.arange(m) + 1, dtype=int)
1 2 3 4 5
1 0 0 0 1 0
2 0 0 0 0 0
3 0 0 0 0 1
4 1 0 0 0 0
5 0 0 1 0 0
因此,如果一个组合没有出现在df1中,这意味着您将该值设置为1,对吗?是的。如果一行出现在df2中而不是df1中,那么它是1如果一个组合没有出现在两者中呢?如果组合没有出现在任何中,那么它是0。就像上面的示例中[3,4]不存在,因此矩阵[3,4]=矩阵[4,3]=0我编辑了我的答案,以向您展示如何将其推广到更大的数据中,谢谢。因此,如果组合没有出现在df1中,这意味着您将值设置为1,对吗?是的。如果df2中存在一行,但没有出现在df1中,那么它是1如果组合没有出现在两者中呢?如果组合没有出现在任何中,那么它是0。如上述示例所示[3,4]不存在,因此矩阵[3,4]=矩阵[4,3]=0我编辑了我的答案,向您展示了如何将其推广到更大的数据,谢谢。+
astype
用于整洁的输出!如何将此答案推广到大数据集?+astype
用于整洁的输出!如何将此答案推广到大数据集?idx1和idx2是什么?@code\u忍者感谢您的提问。它们是在较旧版本的po中定义的st one可能已经看穿了编辑历史。我的错误是,我在更新post.v=np.zeros((m,m))时忘记了将其添加回去处理大型数据集时出现内存错误。是否有修复方法?Thanks@ChaitaliSarkar在这种情况下,m
的值是多少?m的值是96575 idx1和idx2是什么?@code\u忍者谢谢你的提问。它们是在旧版本的帖子中定义的,你可以通过编辑历史看到。我的错误是,我忘了将其添加回去当更新post.v=np时,在处理大型数据集时,零((m,m))会导致内存错误。您有解决方法吗?Thanks@ChaitaliSarkar在这种情况下,m
的值是多少?m的值是96575