使用充满重复项的列表替换 ID

Replacing IDs using a list full of duplicates

这是我的问题。基本上,我有一个包含很多比较的数据框。 当 value = 0 时,这意味着我们在每个特征中具有相同值的相同观察值前面。我想替换原始 DATAFRAME 中的那些 ID,以便我只有一个 ID 用于相同的观察。 我的想法是创建一个字典或列表,其中包含彼此相似的所有值,但我的 DF 的问题是,如果我有 (idA = 1, idB = 2, value = 0),我也有一行 idA和 idB 交换(idA = 1,idB = 2,值 = 0)。 例如,我想用一个 ID 替换 ID (49923-19848-22162-14780-13689) 和 ID (23549-47291-2576),但由于存在重复问题,我不确定如何这样做。

基本上这是我的df

    index   idA     idB     Value   
    3       49923   19848   0.0     
    28899   14780   49923   0.0     
    31470   49923   13689   0.0     
    44702   22162   49923   0.0     
    21125   19848   22162   0.0     
    31760   14780   19848   0.0     
    38533   13689   19848   0.0     
    5       23549   47291   0.0     
    7665    28527   23549   0.0     
    23574   2576    23549   0.0     
    40879   28527   47291   0.0     
    41209   2576    47291   0.0     

我想创建一个新词典,例如:

d = {49923:(19848, 22162, 14780, 13689), 23549:(47291, 2576) }

这样我就可以使用键将列表中的 ID 替换为值。 例如,我希望 ID 19848、22162、14780、13689 成为 ID 49923。 实际上,ID 编号根本不重要,我只想要一种方法来查找哪些是相同的行并在原始数据框中替换它们的 ID,就像

id    feat1    feat2  feat3    feat4
1      ...      ...   ...       ....
2      ...      ...   ...       ....
3      ...      ...   ...       ....
...    ...      ...   ...       ....
13689  a        b     c         d
...    ...      ...   ...       ....
14780  a        b     c         d
...    ...      ...   ...       ....
19848  a        b     c         d
...    ...      ...   ...       ....
22162  a        b     c         d
...    ...      ...   ...       ....
49923  a        b     c         d

我的最终目标是拥有这个

id    feat1    feat2  feat3    feat4
1      ...      ...   ...       ....
2      ...      ...   ...       ....
3      ...      ...   ...       ....
...    ...      ...   ...       ....
...    ...      ...   ...       ....
...    ...      ...   ...       ....
...    ...      ...   ...       ....
...    ...      ...   ...       ....
49923  a        b     c         d

(ps我不关心id顺序之类的,我只想将相同的Id分配给具有相同值的行。

感谢您的帮助!

您可以转换为图形并识别连通分量

import networkx
g = networkx.from_pandas_edgelist(df, "idA", "idB")
grps = [a for a in networkx.connected_components(g)]
print(grps)
# [{49923, 19848, 22162, 13689, 14780}, {2576, 47291, 23549, 28527}]