2017-11-04 6 views
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']) 


Expected Output: 

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 

第2のデータフレームで形成された新しい行を示すマトリックスの1を持つマトリックスを作成したいと思います。たとえば、2 4は両方のデータフレームにある行なので、行列は[2] = 0と[4,2] = 0の関係を双方向にして配置します。第2のデータフレームで新しい行が形成された新しいマトリックス

2)1〜4は、第1データフレームでない第二データフレーム内の新しい行は、私たちは場合行列[1,4] = 1、[4,1] = 1

3)を入れて組み合わせは、両方のdfsで[3,4]のように表示されません。その行列[3,4] =行列[4,3] = 0

また、これは表現型データセットであり、したがって私の実際のデータセットは巨大ですが必要ですです。すべて0ためreindex1値について

+0

はあなたがスパース5×5を得た方法少し説明してもらえますか? – Dark

+0

これは私の大きなデータセットの小さな代表的なデータセットです。大きなデータセットでもコードを動作させたい –

+0

タグnumpyを追加します。 – jezrael

答えて

1

使用merge

df = df2.merge(df1, 'outer', indicator=True).query("_merge=='left_only'") 
print (df) 
    node1 node2 weight  _merge 
0  1  4  1 left_only 
3  3  5  1 left_only 

df3 = df.set_index(['node1','node2'])['weight'].unstack().notnull().astype(int) 

df3 = df3.mul(df3.T, fill_value=1) 

cols = ['node1','node2'] 
min1 = df1[cols].values.min() 
max1 = df1[cols].values.max() 
min2 = df2[cols].values.min() 
max2 = df2[cols].values.max() 


a = range(min(min1,min2), max(max1, max2) + 1) 

df3 = df3.reindex(index=a, columns=a).fillna(0).astype(int) 
print (df3) 
    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 
+0

データセットが非常に大きい場合、これは機能しますか? –

+0

私は出力を理解しました。 OPがその列名を疎にすることを望みます。それは多くの疑問を解決します – Dark

+0

@jezrael私は行列形式で最終的な答えをしたいので、私はそれをdf3に変換しました。しかし、私は実際のデータセットで作業しているとき、行列は100,000X100,000の次元を持っています。 –

関連する問題