Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用第二个数据帧wrt第一个数据帧中形成的新行创建矩阵_Python_Pandas_Dataframe_Matrix - Fatal编程技术网

Python 使用第二个数据帧wrt第一个数据帧中形成的新行创建矩阵

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

我想创建一个矩阵,矩阵中的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],
     '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