开发者社区> 问答> 正文

在字典中对互斥的id进行分组

我正在进行一个项目,我的任务是识别通过4个id之一连接的组。例如:

在本例中,第一个元素是一个组,因为它的id与列表中的任何其他id都不匹配。第二个和第三个元素创建第二个组,因为它们的id中至少有一个是匹配的。 我最初的想法是创建独特的ID通过连接4 ID,然后比较他们的价值观已经出现在关键字如果至少有部分匹配,将它添加到各自的键-值对,否则更新关键字与一个新的键-值对,包括各自的惟一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

基于三元素示例的期望结果是group_dict:

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

不幸的是,我在这个解决方案中得到了一个RuntimeError,因为字典的大小在迭代期间发生了变化。您能给我推荐一下,如何使这段代码工作,或者如何用另一种方法来解决分组问题吗?提前感谢您的反馈! 问题来源StackOverflow 地址:/questions/59379564/grouping-mutually-exclusive-ids-in-a-dictionary

展开
收起
kun坤 2019-12-29 21:59:00 458 0
1 条回答
写回答
取消 提交回答
  • 你可以在一个集合中收集相关的索引:

    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
    
    2019-12-29 21:59:06
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载