Cargue nodos con atributos y bordes de DataFrame a NetworkEx -- python campo con pandas campo con graph campo con networkx camp Relacionados El problema

Load nodes with attributes and edges from DataFrame to NetworkX


15
vote

problema

Español

Soy nuevo con Python para trabajar con gráficos: NetworkEx. Hasta ahora he usado Gefhi. Allí los pasos estándar (pero no los únicos posibles) son:

  1. Cargar las informaciones de los nodos de una mesa / hoja de cálculo; Una de las columnas debe ser ID y el resto son metadatos sobre los nodos (los nodos son personas, por lo que el género, los grupos ... normalmente se utilizarán para colorear). Como:

      id;NormalizedName;Gender per1;Jesús;male per2;Abraham;male per3;Isaac;male per4;Jacob;male per5;Judá;male per6;Tamar;female ...   
  2. Cargue los bordes también de una tabla / hoja de cálculo, utilizando los mismos nombres para los nodos, ya que fue en el ID de la columna de la hoja de cálculo de nodos con normalmente cuatro columnas (objetivo, fuente, peso y tipo): < / p>

      Target;Source;Weight;Type per1;per2;3;Undirected per3;per4;2;Undirected ...   

Estos son los dos cuadros de datos que tengo y que quiero cargar en Python. Leyendo sobre NetworkEx, parece que no es muy posible cargar dos tablas (una para nodos, una para los bordes) en el mismo gráfico y no estoy seguro de cuál sería la mejor manera:

  1. ¿Debo crear una gráfica solo con las informaciones de los nodos del flujo de datos y luego agregar (agregar) los bordes del otro refrigerador? Si es así, y desde nx.from_pandas_dataframe () espera información sobre los bordes, supongo que no debería usarlo para crear los nodos ... ¿Debo aprobar la información como listas?

  2. ¿Debo crear una gráfica solo con la información de los bordes del flujo de datos y luego agregar a cada nodo la información del otro protector de datos como atributos? ¿Existe una mejor manera de hacer eso que al iterar sobre el flujo de datos y los nodos?

Original en ingles

I am new using Python for working with graphs: NetworkX. Until now I have used Gephi. There the standard steps (but not the only possible) are:

  1. Load the nodes informations from a table/spreadsheet; one of the columns should be ID and the rest are metadata about the nodes (nodes are people, so gender, groups... normally to be used for coloring). Like:

    id;NormalizedName;Gender per1;Jesxc3xbas;male per2;Abraham;male per3;Isaac;male per4;Jacob;male per5;Judxc3xa1;male per6;Tamar;female ... 
  2. Then load the edges also from a table/spreadsheet, using the same names for the nodes as it was in the column ID of the nodes spreadsheet with normally four columns (Target, Source, Weight and Type):

    Target;Source;Weight;Type per1;per2;3;Undirected per3;per4;2;Undirected ... 

This are the two dataframes that I have and that I want to load in Python. Reading about NetworkX, it seems that it's not quite possible to load two tables (one for nodes, one for edges) into the same graph and I am not sure what would be the best way:

  1. Should I create a graph only with the nodes informations from the DataFrame, and then add (append) the edges from the other DataFrame? If so and since nx.from_pandas_dataframe() expects information about the edges, I guess I shouldn't use it to create the nodes... Should I just pass the information as lists?

  2. Should I create a graph only with the edges information from the DataFrame and then add to each node the information from the other DataFrame as attributes? Is there a better way for doing that than iterating over the DataFrame and the nodes?

           

Lista de respuestas

31
 
vote
vote
La mejor respuesta
 

Cree el gráfico ponderado 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')   

Añada los atributos de los nodos 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 la gráfica 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]   

Actualización:

ASO DE .container { display: flex; height: 98vh; margin: 1vh 1vw; } .item { border: 1px solid red; flex: 0 0 50px; margin: .5em; } .wide { flex: 1 }0 El orden de argumento de .container { display: flex; height: 98vh; margin: 1vh 1vw; } .item { border: 1px solid red; flex: 0 0 50px; margin: .5em; } .wide { flex: 1 }1111 tiene cambiado : .container { display: flex; height: 98vh; margin: 1vh 1vw; } .item { border: 1px solid red; flex: 0 0 50px; margin: .5em; } .wide { flex: 1 }2

usando el ejemplo desde arriba:

  .container {    display: flex;    height: 98vh;    margin: 1vh 1vw;  }    .item {    border: 1px solid red;    flex: 0 0 50px;    margin: .5em;  }    .wide {    flex: 1  }3  

y a partir de .container { display: flex; height: 98vh; margin: 1vh 1vw; } .item { border: 1px solid red; flex: 0 0 50px; margin: .5em; } .wide { flex: 1 }4 , .container { display: flex; height: 98vh; margin: 1vh 1vw; } .item { border: 1px solid red; flex: 0 0 50px; margin: .5em; } .wide { flex: 1 }5 es reemplazado por .container { display: flex; height: 98vh; margin: 1vh 1vw; } .item { border: 1px solid red; flex: 0 0 50px; margin: .5em; } .wide { flex: 1 }6 .

 

Create the weighted graph from the edge table using 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') 

Then add the node attributes from dictionaries using 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()) 

Or iterate over the graph to add the node attributes:

for i in sorted(G.nodes()):     G.node[i]['name'] = nodes.name[i]     G.node[i]['gender'] = nodes.gender[i] 

Update:

As of nx 2.0 the argument order of nx.set_node_attributes has changed: (G, values, name=None)

Using the example from above:

nx.set_node_attributes(G, pd.Series(nodes.gender, index=nodes.node).to_dict(), 'gender') 

And as of nx 2.4, G.node[] is replaced by G.nodes[].

 
 
         
         
7
 
vote

Aquí está básicamente la misma respuesta, pero actualizada con algunos detalles completados. Comenzaremos con básicamente la misma configuración, pero aquí no habrá índices para los nodos, solo nombraremos para dirigirse a @lancelotholmes comentar y hacerlo más. General:

  .container {    display: flex;    height: 98vh;    margin: 1vh 1vw;  }    .item {    border: 1px solid red;    flex: 0 0 50px;    margin: .5em;  }    .wide {    flex: 1  }7  

Aquí, el parámetro .container { display: flex; height: 98vh; margin: 1vh 1vw; } .item { border: 1px solid red; flex: 0 0 50px; margin: .5em; } .wide { flex: 1 }8 le dice a NetworkEx para mantener todas las propiedades en las propiedades de LinkData como enlace. En este caso, lo he hecho un tipo .container { display: flex; height: 98vh; margin: 1vh 1vw; } .item { border: 1px solid red; flex: 0 0 50px; margin: .5em; } .wide { flex: 1 }9 , pero si no lo necesita, entonces puede hacerlo otro tipo en la forma obvia.

Ahora, dado que necesita coincidir con NodedAdata con el nombre de los nodos generados desde el LinkData, debe configurar el índice de la propiedad DataData DataData para ser la propiedad 99887776620 , antes de que sea un Diccionario para que Networkx 2.x pueda cargarlo como atributos del nodo.

  <div class="container">    <div class="item wide">Auto Remaining Width</div>    <div class="item">50px</div>    <div class="item">50px</div>    <div class="item">50px</div>  </div>1  

Esto carga en todo el flama de datos de Nodedata en un diccionario en el que la clave es el nombre, y las otras propiedades son clave: pares de valor dentro de esa tecla (es decir, propiedades de nodo normales donde el índice de nodo es su nombre).

 

Here's basically the same answer, but updated with some details filled in. We'll start with basically the same setup, but here there won't be indices for the nodes, just names to address @LancelotHolmes comment and make it more 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()) 

Here the True parameter tells NetworkX to keep all the properties in the linkData as link properties. In this case I've made it a DiGraph type, but if you don't need that, then you can make it another type in the obvious way.

Now, since you need to match the nodeData by the name of the nodes generated from the linkData, you need to set the index of the nodeData dataframe to be the name property, before making it a dictionary so that NetworkX 2.x can load it as the node attributes.

nx.set_node_attributes(G, nodeData.set_index('name').to_dict('index')) 

This loads the whole nodeData dataframe into a dictionary in which the key is the name, and the other properties are key:value pairs within that key (i.e., normal node properties where the node index is its name).

 
 
5
 
vote

un pequeño comentario:

from_pandas_dataframe no funciona en NX 2, refiriéndose a este

  <div class="container">    <div class="item wide">Auto Remaining Width</div>    <div class="item">50px</div>    <div class="item">50px</div>    <div class="item">50px</div>  </div>2  

Creo que en NX 2.0 va así:

  <div class="container">    <div class="item wide">Auto Remaining Width</div>    <div class="item">50px</div>    <div class="item">50px</div>    <div class="item">50px</div>  </div>3  
 

A small remark:

from_pandas_dataframe doesn't work in nx 2, referring to this one

G = nx.from_pandas_dataframe(edges, 'source', 'target', 'weight') 

I think that in nx 2.0 it goes like that:

G = nx.from_pandas_edgelist(edges, source = "Source", target = "Target") 
 
 

Relacionados problema

2  ¿Actualizando a Networkx 2.0 en Conda?  ( Updating to networkx 2 0 in conda ) 
Necesito usar maximum_spanning_tree en mi cuaderno de Python (Júpiter). ¿Puede alguien decirme cómo puedo actualizar mi redX a 2. + en Conda? Leí la docum...

0  Cómo convertir un gráfico no dirigido a Multigraph usando NetworkX  ( How to convert a undirected graph to multigraph using networkx ) 
New to Networkx Biblioteca, me gustaría saber si hay una manera de obtener una gráfica múltiple de un gráfico sin hijos generado utilizando el barabasi_alber...

0  Networkx OutEdEdView para enumerar  ( Networkx outedgeview to list ) 
Necesito encadenar los datos de OutEdgeView de NetworkX Networkx en una lista. Recuerdo el graph.edges(data=True) Se utiliza para devolver una lista como ...

1  Nodos infantiles recursivos de redX  ( Networkx recursive child nodes ) 
Uso de la última redx ( versión 1.11 en el momento de la escritura), ¿qué es ¿La forma más eficiente de recuperar todos los nodos infantiles (recursivos) par...

9  Vértices de grupo en clusters usando NetworkX  ( Group vertices in clusters using networkx ) 
Estoy tratando de representar gráficamente algunos gráficos, y necesito agrupar en Clusters algunos nodos que tienen características comunes. Estoy usando...

0  NETWORTX NODE Traversal  ( Networkx node traversal ) 
Uso de la biblioteca Networkx de Python, creé un gráfico no dirigido para representar una red de relaciones entre varias personas. Un fragmento de mi código e...

5  ¿Hay alguna función que devuelva los bordes fuera de un nodo?  ( Is there any function that returns the out edges of a node ) 
Estoy usando Python con el paquete NetworkX. Necesito encontrar los nodos conectados a los bordes de un nodo dado. Sé que hay una función Networkx.DiGraph.out...

1  Construir el marco de datos usando GroupBy  ( Construct data frame using groupby ) 
Mi contexto de datos se ve así: date id pct_change 12355258 2010-07-28 60059 0.210210 12355265 2010-07-28 60060 0.592000...

0  Cómo segregar los datos de prueba de trenes en el siguiente caso  ( How to segregate train test data in the following case ) 
Aprendiendo Python para el análisis de datos, me encontré con un problema Tengo un flujo de datos generado de la siguiente manera - u1 u2 ...

1  Python, Networkx Problema de celosía hexagonal - ¿Cómo crear una celosía perfecta?  ( Python networkx hexagonal lattice problem how to create a perfect lattice ) 
Así que estoy tratando de generar una celosía hexagonal usando NetworkX en Python. Después de usar código: G = nx.hexagonal_lattice_graph(m=2, n=2, periodi...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos