Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Pandas中,如何基于其他列的公共相互关系创建唯一ID?_Python_Pandas - Fatal编程技术网

Python 在Pandas中,如何基于其他列的公共相互关系创建唯一ID?

Python 在Pandas中,如何基于其他列的公共相互关系创建唯一ID?,python,pandas,Python,Pandas,我有一个带有两个ID列的数据帧。我需要设置一个唯一的公共相关ID,并满足以下条件:如果ID1或ID2中有一些是公共的,那么它们必须具有相同的公共ID(ID_3) 数据帧看起来像: df = pd.DataFrame({'ID_1': ['111', '111', '222', '333', '333', '444', '555', '666', '666', '777'], 'ID_2': ['AAA', 'BBB', 'AAA', 'BBB', 'CCC', 'D

我有一个带有两个ID列的数据帧。我需要设置一个唯一的公共相关ID,并满足以下条件:如果ID1或ID2中有一些是公共的,那么它们必须具有相同的公共ID(ID_3)

数据帧看起来像:

df = pd.DataFrame({'ID_1': ['111', '111', '222', '333', '333', '444', '555', '666', '666', '777'],
               'ID_2': ['AAA', 'BBB', 'AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'DDD', 'FFF', 'CCC']})
所需输出应如下所示:

ID_1 ID_2 身份证3 111 AAA 1. 111 BBB 1. 222 AAA 1. 333 BBB 1. 333 CCC 1. 444 DDD 2. 555 EEE 3. 666 DDD 2. 666 FFF 2. 777 CCC 1. 我想我们可以用以下方法来解决这个问题:

import networkx as nx

G=nx.Graph()
G.add_edges_from(df[['ID_1','ID_2']].to_numpy().tolist())
cc = list(nx.connected_components(G))
L=[dict.fromkeys(b,a) for a, b in enumerate(cc,1)]
d={k: v for d in L for k, v in d.items()}
out = df.assign(ID_3=df['ID_2'].map(d))

要查看连接的组件,请执行以下操作:

print(cc)
[{'111', '777', '222', 'AAA', '333', 'BBB', 'CCC'}, 
 {'DDD', 'FFF', '666', '444'}, {'555', 'EEE'}]

请将输出粘贴为代码或表格,而不是图片。请澄清您的情况?为什么有些行ID_3=1,而有些行ID_3=2。“共同”方面在哪里?您的标准不清楚。为什么第一行和第二行的ID_3相同?第一行和第二行的ID_1相同,因此第三行的ID_3必须与第一行的ID_2相同,因此其ID_3必须与第一行的ID_3相同谢谢!“为了解决这个问题,我已经苦苦挣扎了一个星期。”游艇夫很高兴我能帮上忙Wow从未期望networkx包含在熊猫问题的解决方案中。学到了一些新东西。@Pygirl networkx有一个用于添加边的
nx.from\u pandas\u edgelist
方法:
print(cc)
[{'111', '777', '222', 'AAA', '333', 'BBB', 'CCC'}, 
 {'DDD', 'FFF', '666', '444'}, {'555', 'EEE'}]