python - Python NetworkX 将 Panda 的整数转换为浮点数
问题描述
我正在尝试从 pandas 数据框构建 networkx 图,并在绘制时使用节点位置数组。我遇到的问题是将熊猫列包含为边缘属性时。如果属性列是浮点类型,它会将节点 ID (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()
解决方案
好的,是的,阅读文档确实很有帮助,因为这个问题就在那里。对于其他想要解决此问题的人,您可以编写自己的来使用 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
其中 attributes 是列标题列表(在我的例子中只是 ['ORDER'])
推荐阅读
- javascript - 正则表达式在Javascript中获取具有复杂结构的字符串
- android - 多次接收警报意图
- sql - 从表中查找同一键是否有更接近的日期值
- spring - 即使指示这样做,Spring Flux 也不会重试
- java - 错误的保存/分配/设置变量
- android - 根据文本宽度垂直或水平设置文本项
- c# - asp.net c# 会话变量
- testing - 在使用js的truffle测试中,如何设置`contract`后面的参数?
- mysql - 在 Django 中将数据插入 MySQL 之前的安全措施
- angular - Angular5 - 如何检查模块是否已加载