如何解决Pandas Edgelist 到 NetworkX 权重聚合
亲爱的
我在 pandasdataframe 中有以下边缘列表(大约有 400 万行,只显示了对问题的描述):
Customer_A | Customer_B | 重量 |
---|---|---|
客户 1 | 客户 2 | 320 |
客户 1 | 客户 3 | 400 |
客户 2 | 客户 1 | 100 |
如您所见,客户 1 和客户 2 之间存在双向连接,当我通过以下方式创建 networkx 图时:
G = nx.from_pandas_edgelist(df,'Customer_A','Customer_B','Weight')
networkx 仅采用两个权重中的一个(我猜是它遇到的第一个权重),而忽略另一个权重。 我的问题是我如何才能真正得到一个具有两个权重之和的图(在这种情况下,客户 1 和客户 2 之间的连接权重为 420)。
我尝试在数据帧上创建一个带有枢轴的邻接矩阵,但考虑到 400 万行,我的内存不足。
我正在考虑拆分成两个图表 - 一个只有两种方式的关系存在,另一种只有一种方式,但我认为他不会解决我的问题。
先谢谢你!
问候, 赫里斯托
解决方法
如果您创建一个无向 MultiGraph,它将允许节点之间存在多条边,其中任意两个节点之间的边是无向的,并且它们的权重可以相加。然后我认为您可以使用此 answer 将 MultiGraph 折叠为常规图,结合边对的权重。
M = nx.from_pandas_edgelist(df,'Customer_A','Customer_B','Weight',create_using=nx.MultiGraph)
然后使用链接的 SO 讨论中接受的答案来缩小图形,或者,如另一个答案所建议的那样,使用在创建图形之前对数据框进行操作的预处理答案。
,我猜你最好在 Pandas 中进行预处理——你称之为“解决方法”。据我所知,NetworkX 中没有用于这种转换的简单工具/方法。 (但是,当然,这并不意味着没有!)。我所知道的 NetworkX 中的所有解决方案都包括迭代边缘。最好的办法是在合理规模的样本上测试两种方法的性能。
“解决方法”的两个想法:
df = df.groupby(
df[['Customer_A','Customer_B']].apply(
lambda row: '|'.join(sorted(row)),axis='columns'
)
).sum().reset_index(drop=False).rename(columns={'index': 'Edges'})
df[['Customer_A','Customer_B']] = df.Edges.str.split('|',expand=True)
df.drop(columns=['Edges'],inplace=True)
G = nx.from_pandas_edgelist(df,'Weight')
或
df = df.groupby(
df[['Customer_A','Customer_B']].apply(
lambda row: tuple(sorted(row)),'Customer_B']] = pd.DataFrame(df.Edges.to_list())
df.drop(columns=['Edges'],'Weight')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。