我有一个图表显示子域与其域的连接,但我想只选择被查询的域超过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个边的节点,然后从该新图中,我希望能够将这些域名/节点选择/存储到新的数据帧中。
困扰我的是,我不知道是否可以从图表中选择数据!
答案 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”。
希望这有帮助。