【问题标题】:Creating matrix with the new rows formed in 2nd dataframe wrt 1st dataframe使用在第二个数据帧和第一个数据帧中形成的新行创建矩阵
【发布时间】:2017-10-29 07:46:50
【问题描述】:
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'])

我想创建一个矩阵,矩阵中的 1 表示在第二个数据帧中形成的新行。 例如- 2 4 是两个数据帧中的一行,因此在矩阵中我们放置 matrix[2,4]=0 和 [4,2]=0 因为关系是双向的。

2) 1 4 是第二个数据帧中的一个新行,它不在第一个数据帧中,因此我们将 matrix[1,4]=1 和 [4,1]=1

3)如果一个组合在两个 dfs 中都不像 [3,4],那么它的矩阵 [3,4]=matrix[4,3]=0

预期输出:

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

【问题讨论】:

  • 所以如果一个组合没有出现在 df1 中,这意味着您将值设置为 1,对吗?
  • 是的。如果 df2 中存在行但 df1 中不存在行,则为 1
  • 如果两者都没有出现组合怎么办?
  • 如果组合中没有任何组合,那么它的 0 。就像上面的例子 [3,4] 不存在,因此 matrix[3,4]=matrix[4,3]=0
  • 我已经编辑了我的答案,向您展示如何将其推广到更大的数据,谢谢。

标签: python pandas dataframe matrix


【解决方案1】:

通过使用pandas..

df=pd.concat([df1,df2],keys=['old','new'])
df=df.drop_duplicates(['node1','node2'],keep=False).loc['new']
df=pd.crosstab(df.node1,df.node2).reindex(index=[1,2,3,4,5],columns=[1,2,3,4,5]).fillna(0)
pd.DataFrame(df.values.T+df.values,index=[1,2,3,4,5],columns=[1,2,3,4,5],dtype=int)
Out[894]: 
   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

【讨论】:

  • + astype 以获得整洁的输出!
  • 如何将这个答案推广到大数据集?
【解决方案2】:

使用node* 列作为numpy 数组的索引器,这可以很容易地完成。

# 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.]])

如果您希望在数据框中输出,请调用 DataFrame 构造函数:

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

【讨论】:

  • 什么是 idx1 和 idx2?
  • @Code_ninja 感谢您的提问。它们是在旧版本的帖子中定义的,人们可以通过编辑历史看到。我的错误是我在更新帖子时忘记添加它。
  • v=np.zeros((m,m)) 在处理大型数据集时会出现内存错误。你有解决办法吗?谢谢
  • @ChaitaliSarkar 在这种情况下m 的值是多少?
  • m的值为96575
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
相关资源
最近更新 更多