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

2024-06-16 10:10:00 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的问题。基本上,我有一个带有大量比较的数据框架。 当value=0时,这意味着我们在同一个观测点前面,每个特征中的值都相同。我想替换原始数据帧中的那些ID,以便对于相同的观察,我只有一个ID。 我的想法是创建一个所有值都彼此相似的字典或列表,但我的DF的问题是,如果我有(idA=1,idB=2,value=0),我还有一行idA和idB交换(idA=1,idB=2,value=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:(19848221621478013689),23549:(472912576)}

这样我就可以使用键将列表中的ID替换为值。 例如,我希望ID19848221621478013689变成ID49923。 实际上,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

(顺便说一句,我不关心id顺序或其他问题,我只想将相同的id分配给具有相同值的行)

谢谢你的帮助


Tags: 数据框架id列表原始数据value特征ida
1条回答
网友
1楼 · 发布于 2024-06-16 10:10:00

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

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

相关问题 更多 >