【问题标题】:Python Networkx and Pandas library not workingPython Networkx 和 Pandas 库不工作
【发布时间】:2017-08-16 17:35:20
【问题描述】:

我下面的代码应该使用 NetworkxPandas 和 CSV 文件中的数据打印图形/网络。代码是 (networkx3.py) -

import csv
import matplotlib.pyplot as plt
import pandas as pd
import networkx as nx

g = nx.Graph()
csv_dict = pd.read_csv('Book1.csv', index_col=[0])
csv_1 = csv_dict.values.tolist()

ini = 0
for row in csv_1:
    for i in row:
        if type(row[i]) is str:
            g.add_edge(ini, int(i), conn_prob=(float(row[i])))

    max_wg_ngs = sorted(g[ini].items(), key=lambda e: e[1]["conn_prob"], reverse=True)[:2]
    sarr = [str(a) for a in max_wg_ngs]
    print "Neighbours of Node %d are:" % ini       
    #print(max_wg_ngs)
    for item in sarr:
        print ''.join(str(item))[1:-1]

    ini += 1

pos = nx.spring_layout(g, scale=100.)
nx.draw_networkx_nodes(g, pos)
nx.draw_networkx_edges(g, pos)
nx.draw_networkx_labels(g, pos)
#plt.axis('off')
plt.show()  

CSV文件中的数据是(Book1.csv) -

,1,2,3,4,5,6,7,8,9,10
1,0,0.257905291,0.775104118,0.239086843,0.002313744,0.416936603,0.194817214,0.163350301,0.252043807,0.251272559
2,0.346100279,0,0.438892758,0.598885794,0.002263231,0.406685237,0.523850975,0.257660167,0.206302228,0.161385794
3,0.753358102,0.222349243,0,0.407830809,0.001714776,0.507573592,0.169905687,0.139611318,0.187910832,0.326950557
4,0.185342928,0.571302688,0.51784403,0,0.003231018,0.295197533,0.216184462,0.153032751,0.216331326,0.317961522
5,0,0,0,0,0,0,0,0,0,0
6,0.478164621,0.418192795,0.646810223,0.410746629,0.002414973,0,0.609176897,0.203461461,0.157576977,0.636747837
7,0.24894327,0.522914349,0.33948832,0.316240267,0.002335929,0.639377086,0,0.410011123,0.540266963,0.587764182
8,0.234017887,0.320967208,0.285193773,0.258198079,0.003146737,0.224412057,0.411725737,0,0.487081815,0.469526333
9,0.302955306,0.080506624,0.261610132,0.22856311,0.001746979,0.014994905,0.63386228,0.486096957,0,0.664434415
10,0.232675407,0.121596312,0.457715027,0.310618067,0.001872929,0.57556548,0.473562887,0.32185564,0.482351246,0

但是代码不起作用。我不明白我要去哪里错了。错误是 -

Traceback (most recent call last):
  File "networkx3.py", line 13, in <module>
    if type(row[i]) is str:
TypeError: list indices must be integers, not float

我不想修改 CSV 文件或其数据。索引列和标题应该被忽略。
我以前问过这个问题,但我没有得到满意的答案。有人可以帮忙吗?
非常感谢:)(使用 Ubuntu 14.04 32 位 VM。感谢 @Adonis 帮助创建原始代码)

【问题讨论】:

  • 你有for i in row。第一次通过那个循环,你认为i 的值是多少?也许尝试打印它以确定。下一个问题是为什么您希望 row[i] 在下一行有意义 - 您假设 i 的值在该语句中是什么?提示 - 错误消息告诉您列表索引不是整数。该语句中唯一像列表索引一样使用的东西是什么?
  • 感谢您回复@Joel。我实际上是 Python 的新手,因此我不太了解。我不明白你之前给出的提示。但我尝试打印i,它们的值来自 CSV 文件。
  • 希望您已经意识到i 就是您所期望的row[i]
  • @Joel 没错。但是我仍然卡在代码中,无法继续前进:(。您可以提供更多建议吗?非常感谢您的帮助
  • 所以你不应该对row[i]做任何事情。到处都有row[i],你几乎肯定是指i。 [并且i 是条目名称的错误选择 - 您应该使用更具描述性的名称]

标签: python-2.7 pandas csv networkx


【解决方案1】:

回答我自己的问题有点晚了,但在@Joel 和@Adonis 的一些宝贵帮助下,我终于弄清楚了哪里出了问题。
问题出在第二个for 循环中,我试图将float 值作为string 传递到Graph 中,这给了我一个错误。其他微小的变化会导致输出,但没有任何边,只有节点。
最后,在使用enumerate 函数定义一个连接节点(使用它的索引赋予权力)之后,我得到了所需的输出。唯一要做的更改是在第二个for 循环和if 条件中:
for row in csv_1: for idx, i in enumerate(row): if type(row[idx]) is float: g.add_edge(ini, idx, conn_prob=(float(row[idx])))

感谢 SOF 中所有无私的人的帮助,如果没有你们,我无法做到 :)

【讨论】:

    猜你喜欢
    • 2015-07-14
    • 2014-09-04
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 2015-11-17
    • 2016-12-20
    • 2017-10-15
    相关资源
    最近更新 更多