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

Python how to choose what to print in a networkX graph

我有一个图表显示子域与其域的连接,但我只想 select 仅查询超过 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

注意:在构建图表之前 select 这些值会更容易,这怎么可能?我的意思是,一个数据框列中的 select 值对应于另一个数据框列中的许多值。

编辑: 所以,我有这两个数据框列,主要思想是尝试找出哪些域名被某些子域映射超过 10 次,并且然后 select 这些域名并进一步处理它们。

所以在 B.add_edges_from([(row['subdomain'] , row['domain']) for idx,row in data.iterrows()]) 之后,我的图表由于数据量大而看起来很混乱。 首先,我想在我的图表上只显示超过 10 条边的节点,然后从那个新图表中,我希望能够 select/store 这些域 names/nodes 进入一个新的数据框. 困扰我的是,我不知道是否可以 select 从图表中提取数据!

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

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

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

这基本上是使用 subgraph 通过 Python 的过滤器强制执行的程度标准来归纳 C。

但是请记住,在二分图中,这可能只是 return 一组节点,因为 B 将子域与域相关联,而域本身在它们之间没有任何联系。

如果您尝试检索具有 10 个以上子域的域,并在稍后将其描述为一组星图(一个域在中间,其所有子域都围绕着它),那么最简单的方法是检索这些图表将 运行 a dfs_tree (or a bfs_tree).

如果另一方面,data 的每个 "hit" 域的一个子域都包含一行,那么这意味着一对子域/域之间有多个边是必需的,因此您需要从 Multigraph 而不是图表开始。

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

编辑: 鉴于其他评论和 ,尚不清楚您是否要继续使用基于图形的解决方案。

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

当然,您可以使用 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 有以下列:子域、域、ip

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

希望这对您有所帮助。