【问题标题】:Replacing IDs using a list full of duplicates使用包含重复项的列表替换 ID
【发布时间】:2021-11-29 19:13:35
【问题描述】:

这是我的问题。基本上,我有一个有很多比较的数据框。 当 value = 0 时,这意味着我们在相同的观察前面,每个特征中的值相同。我想替换原始数据帧中的那些 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 分配给具有相同值的行)。

感谢您的帮助!

【问题讨论】:

    标签: python pandas duplicates mapping


    【解决方案1】:

    您可以转换为图形并识别连接的组件

    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}]
    

    【讨论】:

    • 谢谢!它部分解决了我的问题,但我想我可以通过您的解决方案解决一些问题。非常感谢!
    猜你喜欢
    • 2018-04-15
    • 2019-06-06
    • 2022-01-22
    • 2019-04-02
    • 2020-03-21
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多