在 Pandas 中,如何根据其他列的共同相互关系创建唯一 ID?
Posted
技术标签:
【中文标题】在 Pandas 中,如何根据其他列的共同相互关系创建唯一 ID?【英文标题】:In Pandas, how to create a unique ID based on the common interrelation of other columns? 【发布时间】:2021-04-24 14:43:36 【问题描述】:我有一个包含两个 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 | EEE | 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 必须与第 1 行相同 = 1。
第 4 行的 ID_2 与第 2 行相同,因此必须将其 ID_3 设置为与 2nd = 1 相同。
第 5 行的 ID_1 与第 4 行相同,因此 ID_3 = 1。
此时第 6 行是 ID_1 和 ID_2 的唯一组合,因此标记为 ID_3 = 2。
第 7 行 = 3。
但 8th 的 ID_2 与 6th 相同,所以 ID_3 = 2。
等等
【问题讨论】:
请将输出粘贴为代码或表格,而不是图片 给你)) 您能说明一下您的情况吗?为什么有些行 ID_3 = 1 而其他行 2。“共同”方面在哪里? 您的标准不明确。为什么第一行和第二行的 ID_3 相同? 第1行和第2行ID_1相同,所以ID_3必须相同 第3行和第1行ID_2相同,所以ID_3必须和第1行相同 【参考方案1】:我想我们可以使用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']
【讨论】:
非常感谢!我已经苦苦挣扎了一个星期来解决。 哇,没想到 networkx 会包含在 pandas 问题的解决方案中。学到了一些新东西。 @Pygirl networkx 也有一个nx.from_pandas_edgelist
方法来添加边。 :)以上是关于在 Pandas 中,如何根据其他列的共同相互关系创建唯一 ID?的主要内容,如果未能解决你的问题,请参考以下文章