Nuestro equipo especializado pasados ciertos días de trabajo y de recopilar de información, hemos dado con los datos necesarios, deseamos que te sea útil para tu trabajo.
Solución:
A partir de Redx 2.0, puede introducir un diccionario de diccionarios en nx.set_node_attributes
establecer attributes para múltiples nodos. Este es un enfoque mucho más simplificado en comparación con la iteración manual de cada nodo. El diccionario exterior keys representan cada nodo, y los diccionarios internos keys corresponder a la attributes desea configurar para cada nodo. Algo como esto:
attrs =
node0: attr0: val00, attr1: val01,
node1: attr0: val10, attr1: val11,
node2: attr0: val20, attr1: val21,
nx.set_node_attributes(G, attrs)
Puede encontrar más detalles en la documentación.
Usando su ejemplo, asumiendo que su índice es id
, puede convertir su marco de datos df_attributes_only
de nodo attributes a este formato y agregue a su gráfico:
df_attributes_only = pd.DataFrame(
[['jim', 'tall', 'red', 'fat'], ['john', 'small', 'blue', 'fat']],
columns=['id', 'attribute1', 'attribute2', 'attribute3']
)
node_attr = df_attributes_only.set_index('id').to_dict('index')
nx.set_node_attributes(g, node_attr)
g.nodes['jim']
>>> 'attribute1': 'tall', 'attribute2': 'red', 'attribute3': 'fat'
nx.from_pandas_dataframe
(y from_pandas_edgelist
en la última versión estable 2.2), convierte conceptualmente una lista de bordes en un gráfico. Es decir, cada fila en el marco de datos representa un borde, que es un par de 2 nodos diferentes.
Usando esta API no es posible leer nodos’ attributes. Tiene sentido, porque cada fila tiene dos nodos diferentes y mantener columnas específicas para los diferentes nodos sería engorroso y podría causar discrepancias. Por ejemplo, considere la siguiente trama de datos:
node_from node_to src_attr_1 tgt_attr_1
a b 0 3
a c 2 4
¿Cuál debería ser el valor ‘src_attr_1’ para el nodo a? ¿Es 0 o 2? Además, necesitamos mantener dos columnas para cada attribute (ya que es un nodo attribute ambos nodos en cada borde deben tenerlo). En mi opinión, sería un mal diseño admitirlo, y supongo que es por eso que la API de NetworkX no lo hace.
Todavía puedes leer nodos’ attributes, después de convertir el df a un gráfico, de la siguiente manera:
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))
Editar:
En caso de que quieras tener una gran lista de attributes para el nodo de origen, puede extraer el diccionario de estas columnas automáticamente de la siguiente manera:
#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)
Te mostramos las reseñas y valoraciones de los lectores
Te invitamos a añadir valor a nuestra información participando con tu experiencia en los comentarios.