Получить NetworkX 2D положение другой группы узлов в качестве дополнительного столбца Pandas DataFrame - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть DataFrame, построенный в виде списка ребер и нескольких столбцов метаданных дочернего узла и ребра с примерно 10 000 записей.

 Child    |    Parent    |   ChildCategory  |  ChildDescription |  EdgeType | Root |
  C1           'root'             X              Lorem Ipsum        Strong     C1
  C2             C1               X              Lorem Ipsum        Strong     C1
  C3             C2               Y              Lorem Ipsum        Strong     C1
  C4             C2               Y              Lorem Ipsum        Strong     C1
  C5           'root'             X              Lorem Ipsum        Strong     C5
  C6             C5               X              Lorem Ipsum        Strong     C5
  C7             C6               Y              Lorem Ipsum         Weak      C5
  ...           ...              ...                 ...              ..       .. 

Используя networkx, я могу преобразовать кадр данных в граф.

  G = nx.from_pandas_edgelist(df,source="Parent",target= "Child",edge_attr=["EdgeType"],create_using = nx.MultiDiGraph())
  node_meta_data = ["ChildCategory","ChildDescription","Root"]
  for col in node_meta_data:
      nx.set_node_attributes(G,dict(zip(node_list_df,df[col].fillna('').tolist())),col)

Теперь я хочу получить двухмерную позицию каждого узла на группу столбца Root и вернуть его обратно в столбец DataFrame, чтобы я мог визуализировать узлы в другой программе.

Если бы я делал это на всем графике, я мог бы сделать это следующим образом.

df = pd.DataFrame(index=G.nodes())
for col in node_meta_data:
     df[col] = pd.Series(nx.get_node_attributes(G, col))
df['EdgeType'] = nx.get_edge_attributes(G,'EdgeType')


### Here is the problem. 
df['position'] = pd.Series(nx.kamada_kawai_layout(G))) ##Without group by root.

#### But I need position per group of root.
....

Но как бы я go сделал это для группы root, было бы возможно умно использовать pandas group_by вместе с G.subgraph()?

РЕДАКТИРОВАТЬ: столбец позиции должен отражать положение дочернего столбца.

1 Ответ

1 голос
/ 12 апреля 2020

Похоже, вам нужен отдельный подграф, начиная с каждого узла root. Для этого вам необходимо изменить имя каждого узла root, поскольку они должны различаться. Одним из способов может быть:

is_root = df.Parent.eq("'root'")
df.loc[is_root, 'Parent'] += is_root.cumsum().astype(str)

, который даст:

print(node_list_df)

  Child   Parent ChildCategory ChildDescription EdgeType Root
0    C1  'root'1             X       LoremIpsum   Strong   C1
1    C2       C1             X       LoremIpsum   Strong   C1
2    C3       C2             Y       LoremIpsum   Strong   C1
3    C4       C2             Y       LoremIpsum   Strong   C1
4    C5  'root'2             X       LoremIpsum   Strong   C5
5    C6       C5             X       LoremIpsum   Strong   C5
6    C7       C6             Y       LoremIpsum     Weak   C5

Теперь, если мы построим график из измененного фрейма данных, мы теперь получим два разных подграфа для преемников Происходит от каждого root узла:

G = nx.from_pandas_edgelist(node_list_df,source="Parent",
                          target= "Child",
                          create_using = nx.DiGraph())

pos = nx.kamada_kawai_layout(G)

nx.draw(G, pos=pos, 
        node_color='lightblue', 
        with_labels=True,
        node_size=500)

enter image description here

Теперь мы можем обновить информационный кадр с позициями из компоновки с помощью:

pos = (pd.DataFrame(pos, index=['x', 'y']).T
         .rename_axis('Parent')
         .reset_index())
df_out = node_list_df.merge(pos, on='Parent', sort=False)

print(df_out)

  Child   Parent ChildCategory ChildDescription EdgeType Root         x  \
0    C1  'root'1             X       LoremIpsum   Strong   C1  1.000000   
1    C2       C1             X       LoremIpsum   Strong   C1  0.467196   
2    C3       C2             Y       LoremIpsum   Strong   C1 -0.055515   
3    C4       C2             Y       LoremIpsum   Strong   C1 -0.055515   
4    C5  'root'2             X       LoremIpsum   Strong   C5 -0.883338   
5    C6       C5             X       LoremIpsum   Strong   C5 -0.345431   
6    C7       C6             Y       LoremIpsum     Weak   C5  0.200324   

          y  
0 -0.002704  
1  0.149699  
2  0.333853  
3  0.333853  
4 -0.230175  
5 -0.363323  
6 -0.459552  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...