nx.from_pandas_dataframe
(и from_pandas_edgelist
в последней стабильной версии 2.2) концептуально преобразует список ребер в граф.Т.е. каждая строка в кадре данных представляет ребро, представляющее собой пару 2 разных узлов .
. С помощью этого API невозможно прочитать атрибуты узлов.Это имеет смысл, поскольку каждая строка имеет два разных узла, и хранение определенных столбцов для разных узлов будет громоздким и может привести к расхождениям.Например, рассмотрим следующий кадр данных:
node_from node_to src_attr_1 tgt_attr_1
a b 0 3
a c 2 4
Каким должно быть значение 'src_attr_1' для узла a?Это 0 или 2?Более того, нам нужно сохранить два столбца для каждого атрибута (поскольку это атрибут узла, он должен быть у обоих узлов в каждом ребре).По моему мнению, было бы плохим дизайном поддерживать его, и я полагаю, что именно поэтому NetworkX API этого не делает.
Вы все равно можете прочитать атрибуты узлов после преобразования df в график следующим образом:
import networkx as nx
import pandas as pd
# Build a sample dataframe (with 2 edges: 0 -> 1, 0 -> 2, node 0 has attr_1 value of 'a', node 1 has 'b', node 2 has 'c')
d = {'node_from': [0, 0], 'node_to': [1, 2], 'src_attr_1': ['a','a'], 'tgt_attr_1': ['b', 'c']}
df = pd.DataFrame(data=d)
G = nx.from_pandas_edgelist(df, 'node_from', 'node_to')
# Iterate over df rows and set the source and target nodes' attributes for each row:
for index, row in df.iterrows():
G.nodes[row['node_from']]['attr_1'] = row['src_attr_1']
G.nodes[row['node_to']]['attr_1'] = row['tgt_attr_1']
print(G.edges())
print(G.nodes(data=True))
Редактировать:
Если вы хотите иметь большой список атрибутов для исходного узла, вы можете автоматически извлечь словарь из этих столбцов следующим образом:
#List of desired source attributes:
src_attributes = ['src_attr_1', 'src_attr_2', 'src_attr_3']
# Iterate over df rows and set source node attributes:
for index, row in df.iterrows():
src_attr_dict = {k: row.to_dict()[k] for k in src_attributes}
G.nodes[row['node_from']].update(src_attr_dict)