如何解决从 Pandas Dataframe 中提取的节点没有被 NetworkX
| customer_id | limit_reference | OS | limit |
| ----------- | ------------------ | ------ | ------- |
| 1111 | 1111.A.1::1111.B.1 | 0.1 | 5 |
| 1111 | 1111.A.1 | .08 | 5 |
| 9012 | 1111.B.1::9012.B.1 | .15 | 5 |
limit_reference
中的值采用以下形式:ID.contract_reference
。
我需要匹配 customer_id
和 limit_reference
中的所有值,并将它们分组。因此,如果我创建另一个 group_id
列,那么我将:
| customer_id | limit_reference | OS | limit | group_id |
| ----------- | ------------------ | ------ | ------- | ---------|
| 1111 | 1111.A.1::1111.B.1 | 0.1 | 5 | 1 |
| 1111 | 1111.A.1 | .08 | 5 | 1 |
| 9012 | 1111.B.1::9012.B.1 | .15 | 5 | 1 |
我遇到的问题是 networkx
将 1111.A.1::1111.B.1
和 1111.B.1::9012.B.1
识别为 2 个不同的节点,即使它们具有相同的元素 1111.B.1
。
我曾尝试拆分 limit_reference
,但它无法进行哈希处理。这是我试过的代码:
import pandas as pd
import networkx as nx
df_ = pd.read_excel('sample2.xlsx')
G = nx.Graph()
G = nx.from_pandas_edgelist(df_,'customer_id','limit_reference')
cnc = nx.connected_components(G)
pos = nx.spring_layout(G,scale=20,k=2/np.sqrt(G.order()))
df_['group_id'] = [label for node in df_.customer_id for label,component in lookup.items() if node in component]
nx.draw(G,pos,node_color='lightgreen',node_size=1000,with_labels=True)
lookup = {i: component for i,component in enumerate(cnc,1)}
解决方法
您可以使用 pandas 的 limit_reference
方法拆分 Series.str.split()
,例如
import pandas as pd
import networkx as nx
df_ = pd.DataFrame({'customer_id': [1111,1111,9012],'limit_reference': ['1111.A.1::1111.B.1','1111.A.1','1111.B.1::9012.B.1']})
G = nx.Graph()
limit_reference_split = [x for sublist in df_['limit_reference'].str.split('::')
for x in sublist]
G.add_nodes_from(limit_reference_split)
list(G.nodes)
['1111.A.1','1111.B.1','9012.B.1']
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。