python - 在 Pandas 中,如何根据其他列的共同相互关系创建唯一 ID?
问题描述
我有一个包含两个 ID 列的数据框。我需要使用以下条件设置一个唯一的公共关联 ID:如果 ID1 或 ID2 有一些共同点,则它们必须具有相同的 common_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 | ID_3 |
---|---|---|
111 | AAA | 1 |
111 | BBB | 1 |
222 | AAA | 1 |
333 | BBB | 1 |
333 | CCC | 1 |
444 | DDD | 2 |
555 | 电子电气设备 | 3 |
666 | DDD | 2 |
666 | FFF | 2 |
777 | CCC | 1 |
df_output = 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_3': ['1', '1', '1', '1', '1', '2', '3', '2', '2', '1']})
澄清条件
在第 1 行和第 2 行 ID_1 相同,因此它们必须具有相同的 ID_3。
第 3 行的 ID_2 与第 1 行相同,因此其 ID_3 必须与 1st row = 1 相同。
第 4 行与第 2 行具有相同的 ID_2,这就是为什么必须将其设置为与 2nd = 1 相同的 ID_3。
第 5 行的 ID_1 与第 4 行相同,因此 ID_3 = 1。
第 6 行此时有 ID_1 和 ID_2 的唯一组合,因此标记为 ID_3 = 2。
比第 7 行 = 3。
但是 8th 和 6th 有相同的 ID_2,所以 ID_3 = 2。
等等
解决方案
我想我们可以用它networkx
来解决这个问题:
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(out)
ID_1 ID_2 ID_3
0 111 AAA 1
1 111 BBB 1
2 222 AAA 1
3 333 BBB 1
4 333 CCC 1
5 444 DDD 2
6 555 EEE 3
7 666 DDD 2
8 666 FFF 2
9 777 CCC 1
要查看连接的组件:
print(cc)
[{'111', '777', '222', 'AAA', '333', 'BBB', 'CCC'},
{'DDD', 'FFF', '666', '444'}, {'555', 'EEE'}]
推荐阅读
- javascript - 锚标记 IE 11 问题内的文本区域
- java - 空指针异常 Java 购物车“排序”方法
- r - mshapiro.test 'solve.default(R %*% t(R), tol = 1e-18) 中的错误:Lapack 例程 dgesv:系统完全是奇异的:U[7,7] = 0'
- python-3.x - 使用 Pandas 将 dict 条目扩展为行
- c# - 在列表中添加和显示变量
- python - python中我的变量输入的语法无效
- excel - 将 XML 转换为 excel,但前导零被删除
- php - 在 laravel 中注册或登录后如何使用信息消息重定向?
- asp.net - AADSTS50059:使用“{prompt”、“none”} 获取代码时未找到租户识别信息
- mysql - TypeError: Router.use() 需要一个中间件函数但得到一个对象(NodeJs、Express 和 Mysql)