我正在尝试通过如下数据框生成网络:
import pandas as pd
import networkx as nx
df1 = pd.DataFrame({'id_emp' : [1,2,3,4,5],
'roi': ['positive', 'negative', 'positive', 'negative', 'negative'],
'description': ['middle', 'low', 'middle', 'high', 'low']})
df1 = df1.set_index('id_emp')
在我尝试开发的网络上,节点代表id_emp列的值。如果roi
和description
列值相同,则两个节点之间会有边。这是我用来开发的代码:
G = nx.Graph()
G.add_nodes_from([a for a in df1.index])
for cr in set(df1['roi']):
indices = df1[df1['roi']==cr].index
G.add_edges_from(it.product(indices, indices))
for d in set(df1['description']):
indices = df1[df1['description']==d].index
G.add_edges_from(it.product(indices,indices))
pos = nx.kamada_kawai_layout(G)
plt.figure(figsize=(3,3))
nx.draw(G,pos,node_size = 100, width = 0.5,with_labels=True)
plt.show()
输出:
问题:在description
或roi
列中为节点生成的边缘具有相等的值。在给定的示例中,节点4应该没有连接,因为它在描述列中具有不同的值。
我应该怎么做才能同时分析两个条件以使两个节点之间有一条边?
答案 0 :(得分:1)
我不确定在这种情况下为什么要使用图论工具。如果您想查找例如连接的组件(即链接的节点),NetworkX
在这里会很有趣。
但是,如果两个给定的边必须连接完全相同的节点才能将它们视为同一组件的一部分,则这与获取数据帧中重复行的列表实质上是相同的,这可以通过以下方式实现: / p>
df1.roi.str.cat(df1.description, sep='-').reset_index().groupby('roi').id_emp.apply(list)
roi
negative-high [4]
negative-low [2, 5]
positive-middle [1, 3]
Name: id_emp, dtype: object