问题描述
我试图表示A列中的数字与B中对应值之间的关系。
A B
Home [Kitchen,Home,Towel]
Donald [US,02,Donald,Trump]
Trump [Trump,Family,Cat,Dog]
Dog [Dog,Paws]
A列中的数字和B列中的数字是图中的节点。我想将B中的元素连接到A或彼此连接。例如:
- A中的房屋与自身相连;如果我在B列中查找(该值仅出现在第一行中),则B中的Home连接到Kitchen and Towel(正在链接);
- Donald与自己链接在一起,因为Donald仅在B中;但是,B中的唐纳德(Donald)也与美国,02和特朗普(持续链接)相关联;
- 特朗普与唐纳德有往来链接,而往来链接有(家庭,猫和狗);
- 狗与特朗普之间有往来链接,而往来链接(猫和爪子)也有联系。
那么规则应如下:
我应该如何调整代码?
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()
解决方法
将表格转换为熊猫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','Family','Cat','Dog']],['Dog','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')
哪个给我下图:
希望这就是您想要的!