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

Pandas Edgelist 到 NetworkX 权重聚合

如何解决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 举报,一经查实,本站将立刻删除。