在 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?的主要内容,如果未能解决你的问题,请参考以下文章

根据其他两列的值在 Pandas 中创建一个新列[重复]

如何根据pig中列的不同值拆分关系

熊猫交叉加入没有共同的列[重复]

pandas dataframe:如何根据列的值聚合行的子集

根据熊猫数据框中其他列的条件和值创建新列[重复]

根据其他列中的值在 python 3 (pandas) 数据框中创建新列