微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 Pandas Dataframe 中提取的节点没有被 NetworkX

如何解决从 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_idlimit_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     |

我遇到的问题是 networkx1111.A.1::1111.B.11111.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 举报,一经查实,本站将立刻删除。