การสร้างความสัมพันธ์ตามเงื่อนไขภายในเครือข่าย
Aug 17 2020
ฉันพยายามแสดงความสัมพันธ์ระหว่างตัวเลขในคอลัมน์ A และค่าที่สอดคล้องกันใน B
A B
Home [Kitchen, Home, Towel]
Donald [US, 02 , Donald, Trump]
Trump [Trump,Family, Cat, Dog]
Dog [Dog,Cat,Paws]
ตัวเลขในคอลัมน์ A และตัวเลขใน B คือโหนดในกราฟ ฉันต้องการเชื่อมต่อองค์ประกอบใน B ถึง A หรือซึ่งกันและกัน ตัวอย่างเช่น:
- บ้านใน A เชื่อมโยงกับตัวมันเอง ถ้าฉันดูภายในคอลัมน์ B (ค่าจะปรากฏในแถวแรกเท่านั้น) หน้าแรกใน B จะเชื่อมต่อกับห้องครัวและผ้าขนหนู (ลิงค์เข้า)
- โดนัลด์เชื่อมโยงกับตัวเองในขณะที่โดนัลด์อยู่ใน B เท่านั้น; แม้กระนั้นโดนัลด์ใน B ยังเชื่อมต่อกับสหรัฐฯ 02 และทรัมป์ (ลิงก์เชื่อมต่อ);
- ทรัมป์มีลิงก์ขาออกกับโดนัลด์และลิงก์เชื่อมต่อ (ครอบครัวแมวและสุนัข)
- Dog มีลิงค์ส่งออกกับ Trump และลิงค์เข้า (Cat and Paws)
กฎควรเป็นดังนี้:
- ถ้าคำใน A อยู่ในแถวอื่นใน B ให้สร้างลิงก์ส่งออก
- สำหรับแต่ละคำใน B ให้สร้างการเชื่อมโยงไปยังคำใน A หากคำใน A รวมอยู่ใน B ด้วย
ฉันควรปรับรหัสของฉันอย่างไร?
file = file.assign(B=file.B.map(list)).explode('B')
G = nx.DiGraph()
nx.add_path(G, file['A'])
nx.add_path(G, file['B'])
nx.draw_networkx(G)
plt.show()
คำตอบ
2 AzimMazinani Aug 17 2020 at 16:26
การแปลงตารางของคุณเป็นหมีแพนด้าdataframe
จากนั้นวนรอบแถวคุณสามารถเพิ่มขอบที่เกี่ยวข้องดังนี้:
import networkx as nx
import pandas as pd
from pyvis.network import Network
df = pd.DataFrame(
[
['Home', ['Kitchen', 'Home', 'Towel']],
['Donald', ['US', '02' , 'Donald', 'Trump']],
['Trump', ['Trump','Family', 'Cat', 'Dog']],
['Dog', ['Dog', 'Cat' , 'Paws']]
],
columns=['A', 'B']
)
G = nx.DiGraph()
for i, j in enumerate(df['A']):
for index, row in df.iterrows():
if i != index:
if j in row['B']:
G.add_edge(row['A'], j)
else:
for n in row['B']:
if j != n:
G.add_edge(j, n)
if G.in_degree(j) == 0:
G.add_edge(j , j)
N = Network(directed=True) # using pyvis to show self loops as well
for n, attrs in G.nodes.data():
N.add_node(n)
for e in G.edges.data():
N.add_edge(e[0], e[1])
N.write_html('graph.html')
ซึ่งทำให้ฉันมีกราฟต่อไปนี้:

หวังว่านี่คือสิ่งที่คุณต้องการ!