Python NetworkX将Pandas的int转换为float

2024-06-25 23:19:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从一个数据帧构建networkx图,在绘制时使用节点的位置数组。我遇到的问题是将列包含为边属性时。如果属性列是类型float,它将把节点id(int)的值转换为float类型,这将导致networkx的draw函数的位置数组中的索引问题。你知道吗

可以通过在 节点和边都被创建了,但是我觉得应该有一种方法来实现这一点,所以我遗漏了一些明显的东西。你知道吗

谢谢你的帮助。你知道吗

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()

Tags: importnetworkxdf节点asnporderplt
1条回答
网友
1楼 · 发布于 2024-06-25 23:19:45

好的,是的,阅读文档真的很有帮助,因为这个问题就在那里。对于其他任何想绕过这个问题的人,你可以自己编写一个使用itertuples而不是iterrows的程序,这样就不会保留数据类型。你知道吗

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

其中attributes是列标题的列表(在我的例子中只是['ORDER'])

相关问题 更多 >