Подключение столбца узлов на основе другого столбца

#python #pandas #networkx

#python #панды #networkx

Вопрос:

Мне нужно было бы построить сеть, в которой узлы являются веб-сайтами и должны быть сгруппированы на основе присвоенного балла. Если веб-сайт новый, то он будет иметь метку 1, в противном случае 0.

Пример данных:

 url          score             label
web1           5                 1
web2           10                1
web3           5                 0
web4           2                 0
...
  

Я попытался использовать networkx для построения сети. Чтобы сгруппировать сети на основе их оценки, я просто использовал score как общий узел (но, вероятно, был бы лучший способ его представления).
Я хотел бы раскрасить полотна на основе столбца label, но я не знаю, как это сделать.
Мой код:

 import networkx as nx

G = nx.from_pandas_edgelist(df, 'url', 'score')


nodes = G.nodes()
plt.figure(figsize=(40,50)) 
pos = nx.draw(G, with_labels=True, 
              nodelist=nodes,
              node_size=1000) 
  

Я надеюсь, что вы можете дать мне несколько советов.

Комментарии:

1. извините за задержку с принятием и одобрением!

Ответ №1:

Вероятно, граф разделов может быть хорошей идеей, если вы также хотите включить его в score качестве узла. Вы можете начать с создания графика с nx.from_pandas_edgelist тем, как вы это делали, и обновить атрибуты узла следующим образом:

 B = nx.from_pandas_edgelist(df, source='url', target='score')

node_view = B.nodes(data=True)
for partition_nodes, partition in zip((df.url, df.score), (0,1)):
    for node in partition_nodes.to_numpy():
        node_view[node]['bipartite'] = partition
  

Теперь у нас есть атрибуты раздела для каждого узла:

 B.nodes(data=True)
NodeDataView({'web1': {'bipartite': 0}, 5: {'bipartite': 1}, 'web2': 
{'bipartite': 0}, 10: {'bipartite': 1}, 'web3': {'bipartite': 0}, 
'web4': {'bipartite': 0}, 2: {'bipartite': 1}})
  

График может быть представлен с помощью разметки разделов:

 part1_nodes = [node for node, attr in B.nodes(data=True) if attr['bipartite']==0]
fig = plt.figure(figsize=(12,8))
plt.box(False)
nx.draw_networkx(
    B,
    pos = nx.drawing.layout.bipartite_layout(B, part1_nodes),
    node_color=[]
    node_size=800) 
  

введите описание изображения здесь