Solución:
Cree el gráfico ponderado a partir de la tabla de bordes usando nx.from_pandas_dataframe
:
import networkx as nx
import pandas as pd
edges = pd.DataFrame({'source' : [0, 1],
'target' : [1, 2],
'weight' : [100, 50]})
nodes = pd.DataFrame({'node' : [0, 1, 2],
'name' : ['Foo', 'Bar', 'Baz'],
'gender' : ['M', 'F', 'M']})
G = nx.from_pandas_dataframe(edges, 'source', 'target', 'weight')
Luego agregue los atributos de nodo de los diccionarios usando set_node_attributes
:
nx.set_node_attributes(G, 'name', pd.Series(nodes.name, index=nodes.node).to_dict())
nx.set_node_attributes(G, 'gender', pd.Series(nodes.gender, index=nodes.node).to_dict())
O iterar sobre el gráfico para agregar los atributos del nodo:
for i in sorted(G.nodes()):
G.node[i]['name'] = nodes.name[i]
G.node[i]['gender'] = nodes.gender[i]
Actualizar:
A partir de nx 2.0
el orden de los argumentos de nx.set_node_attributes
ha cambiado: (G, values, name=None)
Usando el ejemplo de arriba:
nx.set_node_attributes(G, pd.Series(nodes.gender, index=nodes.node).to_dict(), 'gender')
Y a partir de nx 2.4
, G.node[]
es reemplazado por G.nodes[]
.
Esta es básicamente la misma respuesta, pero actualizada con algunos detalles completados. Comenzaremos básicamente con la misma configuración, pero aquí no habrá índices para los nodos, solo nombres para abordar el comentario de @LancelotHolmes y hacerlo más general:
import networkx as nx
import pandas as pd
linkData = pd.DataFrame({'source' : ['Amy', 'Bob'],
'target' : ['Bob', 'Cindy'],
'weight' : [100, 50]})
nodeData = pd.DataFrame({'name' : ['Amy', 'Bob', 'Cindy'],
'type' : ['Foo', 'Bar', 'Baz'],
'gender' : ['M', 'F', 'M']})
G = nx.from_pandas_edgelist(linkData, 'source', 'target', True, nx.DiGraph())
Aquí el True
El parámetro le dice a NetworkX que mantenga todas las propiedades en linkData como propiedades de enlace. En este caso lo he convertido en un DiGraph
type, pero si no lo necesita, puede convertirlo en otro tipo de la manera obvia.
Ahora, dado que necesita hacer coincidir nodeData por el nombre de los nodos generados a partir de linkData, debe establecer el índice del marco de datos nodeData para que sea el name
propiedad, antes de convertirlo en un diccionario para que NetworkX 2.x pueda cargarlo como los atributos de nodo.
nx.set_node_attributes(G, nodeData.set_index('name').to_dict('index'))
Esto carga todo el marco de datos nodeData en un diccionario en el que la clave es el nombre, y las otras propiedades son pares clave: valor dentro de esa clave (es decir, propiedades de nodo normales donde el índice de nodo es su nombre).
Un pequeño comentario:
from_pandas_dataframe no funciona en nx 2, refiriéndose a este
G = nx.from_pandas_dataframe(edges, 'source', 'target', 'weight')
Creo que en nx 2.0 es así:
G = nx.from_pandas_edgelist(edges, source = "Source", target = "Target")