Python如何选择在networkX图中打印的内容

时间:2015-06-23 08:48:57

标签: python graph dataframe networkx

我有一个图表显示子域与其域的连接,但我想只选择被查询的域超过10次。

B=nx.Graph()
B.add_nodes_from(data['subdomain'],bipartite=0)
B.add_nodes_from(data['domain'],bipartite=1)
B.add_edges_from([(row['subdomain'] , row['domain']) for idx,row in data.iterrows()])


print (B.degree(data['domain']).items())

print (B.degree(data['domain']).values())

给我我需要的值,但我不知道如何使用它们以便仅使用 data ['domain'] 值生成图表高于阈值(例如10)。

图构造的其余代码:

pos = {node:[0, i] for i,node in enumerate(data['domain'])}
pos.update({node:[1, i] for i,node in enumerate(data['subdomain'])})
nx.draw(B, pos, with_labels=False)
nx.draw_networkx_labels(B, pos)
plt.show

注意:在构建图形之前更容易选择这些值,这怎么可能?我的意思是,从一个数据帧列中选择与另一个数据帧列中的许多值相对应的值。

编辑:所以,我有这两个数据帧列,主要想法是尝试查找某些子域名被映射的域名超过10次,然后选择这些域名并进一步处理它们。

所以在B.add_edges_from([(row['subdomain'] , row['domain']) for idx,row in data.iterrows()])之后,由于数据量很大,我的图表看起来很混乱。 首先,我想在我的图表上仅显示具有超过10个边的节点,然后从该新图中,我希望能够将这些域名/节点选择/存储到新的数据帧中。 困扰我的是,我不知道是否可以从图表中选择数据!

1 个答案:

答案 0 :(得分:1)

无法看到data中的内容,并且纯粹根据代码编写方式判断,它似乎只是简单地将子域与域中的域相关联,因此B.degree([bunch of nodes])将返回一个字典,其键是节点,值是节点度。

如果您要做的只是从原始B中引入子图C,其节点将是具有10个以上子域的域,那么您可以执行以下操作:

C = B.subgraph(filter(lambda x:x[1]>10, B.degree(data['domain']).items()))

基本上使用subgraph来诱导C,其程度标准由Python的过滤器强制执行。

请注意,在二分图中,这可能只是返回一组节点,因为B将子域与域关联,域本身之间不会有任何连接。

如果您正在尝试检索具有10个以上子域的域,并在稍后将其描述为一组星形图(中间的域及其周围的所有子域),则检索这些子域的最简单方法图表将运行dfs_tree(或bfs_tree)。

另一方面,如果data包含一个子域的每个“命中”一行,那么这意味着一对子域/域之间需要多个边缘,并且这个原因你需要以Multigraph而不是图表开始。

希望这有帮助,如果提供了有关data的更多详细信息或正在处理的实际问题,我们很乐意修改回复。

修改: 鉴于其他评论和earlier relevant question,目前尚不清楚是否要继续使用基于图表的解决方案。

如果您想继续使用基于图表的解决方案,那么上面的响应将过滤那些附加了多个子域的根域。

当然,您可以使用pandas DataFrame执行相同的操作,例如:

import pandas

data = pandas.read_csv("testFile.csv", index_col=False, header = None)
dataGrouped = data.groupby(1).count() #Group by domain and count the values in the other fields
busyDomains = dataGrouped[dataGrouped[0]>2]

testFile.csv包含列:subdomain,domain,ip

busyDomains现在是另一个DataFrame。这里使用上一个问题的测试数据的主要结果是“example.org”。

希望这有帮助。