Python NetworkX преобразовывает целые числа Panda в плавающие - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь построить диаграммы networkx из кадра данных pandas с массивом позиций для узлов при рисовании.Проблема, с которой я сталкиваюсь, заключается в том, чтобы включить столбцы панд в качестве атрибутов ребер.Если столбец атрибута имеет тип float, он преобразует значение идентификаторов узлов (int) в типы с плавающей точкой, что затем вызывает проблемы при индексации в массиве позиций для функций рисования networkx.

Возможно, это можно исправить путем явного добавления атрибутов после создания узлов и ребер, но я чувствую, что для этого должен быть способ, поэтому я упускаю что-то очевидное.

Спасибо за вашу помощь.

import networkx as nx
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#set up datae frame
UpNodes  =np.array([0,0,1,1,2,2,6,6,8,8,10], dtype=np.int)
DownNodes=np.array([1,2,3,4,4,5,7,8,9,10,11], dtype=np.int)
ORDER    =np.array([2,1,1,1,3,2,1,1,1,2,3],dtype=np.float) #toggle this from int to float

df=pd.DataFrame(
{'UpNodes': UpNodes,
 'DownNodes':DownNodes,
 'ORDER': ORDER},
 columns=['UpNodes','DownNodes','ORDER'])

#create array of spatial positions for nodes
pos=np.array(
[[ 0., 0.  ],
 [ 1., 0.5 ],
 [ 1., -0.5 ],
 [ 2., 1.  ],
 [ 2., 0.25],
 [ 2., -1.  ],
 [ 3., 2.  ],
 [ 4., 3.  ],
 [ 4., 1.  ],
 [ 5., 2.  ],
 [ 5., 0.  ],
 [ 6., 0.  ]]
)

plt.figure('Im a plot')

print df
print df.dtypes
G=nx.from_pandas_edgelist(df,'UpNodes','DownNodes','ORDER')
print G.edges

nx.draw(G, pos, node_size=90, with_labels=False)

print 'Done'

plt.show()

1 Ответ

0 голосов
/ 02 октября 2018

Хорошо, да, это действительно помогает читать документацию, так как эта проблема была тут же.для всех, кто хочет обойти это, вы можете написать свой собственный, чтобы использовать itertuples вместо iterrows, что не сохраняет dtype.

def pandas_to_Network(df,UpNode,DownNode,Attributes):
    #Create a graph
    G=nx.Graph()
    #Loop through the pandas dataframe and add edges
    for row in df.itertuples():
        #convert edge attributes to dictionary form
        edgedata={}
        for edge_key in Attributes:
            edgedata.update({edge_key:getattr(row,edge_key)})

        #create edge
        G.add_edge(getattr(row,UpNode), getattr(row,DownNode),**edgedata)

    return G

Где атрибуты - это список заголовков столбцов (в моем случаепросто ['ЗАКАЗАТЬ'])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...