urs*_*rei 15 python networkx pandas
我想从一个简单的Pandas DataFrame创建一些NetworkX图:
Loc 1 Loc 2 Loc 3 Loc 4 Loc 5 Loc 6 Loc 7
Foo 0 0 1 1 0 0 0
Bar 0 0 1 1 0 1 1
Baz 0 0 1 0 0 0 0
Bat 0 0 1 0 0 1 0
Quux 1 0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)
哪里Foo…是指数,并Loc 1以Loc 7是列.但转换为Numpy矩阵或重新排列似乎不适用于生成输入nx.Graph().是否有实现这一目标的标准策略?我不反对重新格式化Pandas中的数据 - >转储到CSV - >导入到NetworkX,但似乎我应该能够从索引和值中的节点生成边缘.
And*_*den 16
NetworkX期望一个方形矩阵(节点和边),或许*你想传递它:
In [11]: df2 = pd.concat([df, df.T]).fillna(0)
Run Code Online (Sandbox Code Playgroud)
注意:索引和列的顺序是一样的很重要!
In [12]: df2 = df2.reindex(df2.columns)
In [13]: df2
Out[13]:
Bar Bat Baz Foo Loc 1 Loc 2 Loc 3 Loc 4 Loc 5 Loc 6 Loc 7 Quux
Bar 0 0 0 0 0 0 1 1 0 1 1 0
Bat 0 0 0 0 0 0 1 0 0 1 0 0
Baz 0 0 0 0 0 0 1 0 0 0 0 0
Foo 0 0 0 0 0 0 1 1 0 0 0 0
Loc 1 0 0 0 0 0 0 0 0 0 0 0 1
Loc 2 0 0 0 0 0 0 0 0 0 0 0 0
Loc 3 1 1 1 1 0 0 0 0 0 0 0 0
Loc 4 1 0 0 1 0 0 0 0 0 0 0 0
Loc 5 0 0 0 0 0 0 0 0 0 0 0 0
Loc 6 1 1 0 0 0 0 0 0 0 0 0 0
Loc 7 1 0 0 0 0 0 0 0 0 0 0 0
Quux 0 0 0 0 1 0 0 0 0 0 0 0
In[14]: graph = nx.from_numpy_matrix(df2.values)
Run Code Online (Sandbox Code Playgroud)
这不会将列/索引名称传递给图表,如果你想这样做你可以使用relabel_nodes(你可能需要警惕pandas的DataFrames中允许的重复项):
In [15]: graph = nx.relabel_nodes(graph, dict(enumerate(df2.columns))) # is there nicer way than dict . enumerate ?
Run Code Online (Sandbox Code Playgroud)
*目前尚不清楚所需图表的列和索引的确切含义.
小智 8
有点迟到的答案,但现在networkx可以从pandas数据帧中读取数据,在这种情况下,理想情况下,简单有向图的格式如下:
+----------+---------+---------+
| Source | Target | Weight |
+==========+=========+=========+
| Node_1 | Node_2 | 0.2 |
+----------+---------+---------+
| Node_2 | Node_1 | 0.6 |
+----------+---------+---------+
Run Code Online (Sandbox Code Playgroud)
如果您使用邻接矩阵,那么Andy Hayden是对的,您应该注意正确的格式.因为在你的问题中你使用0和1,我想你想看到一个无向图.这可能看起来违反直觉,因为你说Index代表一个人,而列代表一个给定人所属的群体,但另一方面,群体(成员)属于一个人也是正确的.遵循这个逻辑,您实际上应该将组放在索引中,将人员放在列中.
只是旁注:您还可以在有向图的意义上定义此问题,例如,您希望可视化层次结构类别的关联网络.在那里,例如从Samwise Gamgee到Hobbits的关联通常比在另一个方向更强(因为Frodo Baggins更可能是Hobbit原型)
| 归档时间: |
|
| 查看次数: |
14508 次 |
| 最近记录: |