在python list/df中递归查找密钥对关系

Posted

技术标签:

【中文标题】在python list/df中递归查找密钥对关系【英文标题】:Recursively find keypair relationships in python list/df 【发布时间】:2021-12-25 06:45:53 【问题描述】:

我正在尝试从 python 中的 500 万个列表中解析整数对。

它们表示记录网络的成对关系。

我相信递归将是解决此问题的方法,但我找不到好的例子或正确的术语来描述问题。

我想要

遍历关系两边的每条记录 遍历所有其他亲属到两边的每条记录 将所有找到的记录合并到一个组下(列表、字典、最简单的),以便我可以为它们分配记录 ID
import pandas as pd

df_list = [[5213728 ,7381649],
           [2538095 ,5213728],
           [5213728 ,8163900],
           [3453455 ,3434644]
           ]
df_cols = ['MATCHED_KEY','SKEY']

#build a list of unique records
masterlist = pd.concat([pd.DataFrame(df['SKEY'].drop_duplicates()),pd.DataFrame(df['MATCHED_KEY'].drop_duplicates().rename('SKEY'))])


for idx,row in masterlist.iterrows():
    k = row['SKEY']

    #I imagine the next step is to go back through the df and keep adding more keys from both sides to a list until I've exhausted all links, then remove them from my master list and continue...

理想的输出应该是这样的:

 1: [2538095, 5213728,7381649, 8163900],
  2: [3453455, 3434644 ]

但只要找到所有相关记录并将它们分组就足够了

【问题讨论】:

【参考方案1】:

你的情况是networkx

import networkx as nx 
G = nx.from_pandas_edgelist(df, 'MATCHED_KEY', 'SKEY')
l = list(nx.connected_components(G))
d = dict(zip(range(len(l)), l))
d
0: 5213728, 7381649, 8163900, 2538095, 1: 3434644, 3453455

【讨论】:

以上是关于在python list/df中递归查找密钥对关系的主要内容,如果未能解决你的问题,请参考以下文章

python函数:递归函数及二分查找算法

python -------算法

通过递归查找应用依赖

Python:将多个数据框存储在列表中

Python——递归二分查找算法

查找列表中的最小元素(递归) - Python