Python 在Pandas中,如何基于其他列的公共相互关系创建唯一ID?
我有一个带有两个ID列的数据帧。我需要设置一个唯一的公共相关ID,并满足以下条件:如果ID1或ID2中有一些是公共的,那么它们必须具有相同的公共ID(ID_3) 数据帧看起来像: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
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'}]