У меня есть 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()
?
РЕДАКТИРОВАТЬ: столбец позиции должен отражать положение дочернего столбца.