我正在进行一个项目,我的任务是识别通过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
你可以在一个集合中收集相关的索引:
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。