在字典中对互斥ID进行分组

2024-09-26 23:24:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个项目中工作,我的任务是识别通过4个ID连接的组。例如:

enter image description here

在本例中,第一个元素是一个组,因为它的id与列表中的任何其他id都不匹配。第二个和第三个元素创建第二个组,因为它们至少有一个id是匹配的。你知道吗

我最初的想法是通过连接4个ID来创建唯一的ID,然后将它们与dict中已经存在的值进行比较,如果至少存在部分匹配,则将其附加到相应的键值对,否则使用新的键值对更新dict,包括相应的唯一ID。代码:

import pandas as pd
d = {"ID_1" : [7900584388, 7993236875, 7993236875],
     "ID_2" : ["CML00500006425034016", "CML00500006405019019", 
               "CML00500006405019025"],
     "ID_3" : [2010007625, 2010007633, 2010007633],
     "ID_4" : [1016008787, 1016008794, 1016008794]}
df = pd.DataFrame(d, dtype = str).dropna()
group_dict = {"foo":["1_1_1_1"]}
df["UID"] = df["ID_1"] + "_" + df["ID_2"] + "_" + df["ID_3"] + "_" + df["ID_4"]
UID = list(df["UID"])

for i in UID:
    i_split = i.split("_")
    for k, v in group_dict.items():
        x = 0
        c = 0
        for d in v:
            d_split = d.split("_")
            print(d_split)
            if len(set(i_split) & set(d_split)) > 0:
                x += 1
        if x > 0:
            group_dict[k].append(i)
        else:
            group_dict.update({c:[i]})
            c += 1

基于三要素示例的预期结果将是:

{'foo': ['1_1_1_1'], 0: ['7900584388_CML00500006425034016_2010007625_1016008787'], 1: ['7993236875_CML00500006405019019_2010007633_1016008794', '7993236875_CML00500006405019025_2010007633_1016008794']}

不幸的是,这个解决方案出现了运行时错误,因为字典大小在迭代过程中会发生变化。你能给我推荐一下,如何让这段代码工作,或者是一种解决分组问题的替代方法吗?感谢您提前反馈!你知道吗


Tags: 代码inid元素dfforuidgroup
1条回答
网友
1楼 · 发布于 2024-09-26 23:24:49

您可以在一个集合中收集相关索引:

s=set()                                                                                                              
for col in ["ID_1","ID_2","ID_3","ID_4"]: 
     s|= { tuple(idxs) for key,idxs in df.groupby(col).groups.items() }

{(0,), (1,), (1, 2), (2,)}

你可以用它做任何事,例如:

for e in s: 
      if len(e)>1: 
         print( df.loc[list(e)] ) 

         ID_1                  ID_2        ID_3        ID_4
1  7993236875  CML00500006405019019  2010007633  1016008794
2  7993236875  CML00500006405019025  2010007633  1016008794

相关问题 更多 >

    热门问题