【问题标题】:Adding labels to Dataframe from node attributes从节点属性向 Dataframe 添加标签
【发布时间】:2019-09-08 01:12:10
【问题描述】:

我正在尝试使用 Pandas 创建一个数据框,以显示说唱歌手网络中不同的中心性度量。我正在尝试将它们的名称添加到数据框中,同时保持索引不变,以便可以按数字和名称查找它们。我无法将名称添加到不同的列。

我正在使用 python3、networkx 和 pandas。由于我对编程还很陌生,所以我所有的尝试都导致了编译错误。到目前为止,这是我尝试过的:

这是我缩短的数据框。 'G' 是一个图形对象,它被分配了我的数据的节点和边。

rapper_df = pd.DataFrame({'Name': dict(name),  
                          'Degree': dict(nx.degree(G))})

这是我尝试将标签添加到单独的字典以添加到 df。

name_undict = nx.get_node_attributes(G, 'label')
name = []
name.append(name_undict)

字典看起来像这样:https://i.imgur.com/A2YhqYH.png

我希望数据框有一个索引、2 列('Name' 和 'Degree')以及行内的相应数据(例如:1 - Snoop Dogg - 4),但我在第 1 行收到编译错误代码的 rapper_df 部分。

ValueError: 字典更新序列元素#0 的长度为 5214; 2 是必需的

由于我对此很陌生,因此我或多或少地不知所措。感谢您花时间回答。

最好的问候, 兰加

【问题讨论】:

  • 您能否补充一下,您在哪一行收到此错误,以及您的代码中的 G 是什么?
  • 我编辑了这个问题。现在清楚了吗?

标签: python-3.x pandas networkx


【解决方案1】:

您可能想要以下内容:

attr_dict = nx.get_node_attributes(G, 'label')
deg_dict = dict(nx.degree(G))

combined = [(name, deg) for (name, deg) in zip(attr_dict.values(),
            deg_dict.values()) if attr_dict.keys() == deg_dict.keys()]
rapper_df = pd.DataFrame({'Name': [name[0] for name in combined],  
                          'Degree': [deg[1] for deg in combined]})

【讨论】:

  • 别担心。我也在没有任何通知的情况下被否决了。而且我认为投票不应该仅仅基于代码是否运行。我认为 SO 应该改变关于否决票的政策。只有在留下评论的情况下,它们才应该是可能的,否则只会失去动力。你不写长篇大论,不为别人工作,你甚至不知道你是否会因此受到惩罚。
  • 对不起,回答迟了,我刚开始测试它。可悲的是它似乎不起作用,我只收到正确的列名,但里面没有任何数据。关于否决,@jottbe 我不知道谁对你投了反对票,我感谢你对字典及其局限性的解释。遗憾的是,我的支持不会出现,因为我没有足够的代表。
  • 这很可能是由于if attr_dict.keys() == deg_dict.keys() 条件。您需要确保keys() 的顺序在attr_dictdeg_dict 中是相同的 - 然后它将起作用。
  • 它们的顺序似乎相同,还是我遗漏了什么? link