从成对列表开始替换列中值的有效方法

Efficient way to replace values in a column starting from a list of pairs

我正在尝试替换数据中的重复项,我正在寻找一种有效的方法来做到这一点。

我有一个包含 2 列的 df,idA 和 idB,如下所示:

idA   idB
22    5
22    590
5     6000

这是一个有相似之处的df。 我想创建一个字典,其中键是 id,值是一个列表,其中包含链接到该键的所有设备。示例:

d[5] = [22, 6000]
d[22] = [5, 590]

我正在做的是:

ids = set(gigi_confirmed['idA'].unique()).union(set(gigi_confirmed['idB'].unique()))

dup_list = list(zip(A_confirmed, B_confirmed))

dict_dup = dict()


for j in ids:
    
    l1 = []
    
    for i in range(0, len(dup_list)):
    
        if j in dup_list[i]:
            
            l2 = list(dup_list[i])
            l2.remove(j)
                       
            l1.append(l2[0])
            
            dict_dup[j] = l1 

是否可以提高效率?

我必须在这里做一些猜测,因为你的问题不是很清楚,但我的理解是,你想要一个字典,将 idAidB 中的每个 id 映射到在另一侧找到的 ID 列表,来自那个 ID。

如果我对你的问题的理解正确,我会通过直接构造一个将 id 映射到 id 集的字典来解决它。

idA = [22, 22, 5]
idB = [5, 590, 6000]

dict_dup = dict()
for a, b in zip(idA, idB):
    if a not in dict_dup:
        dict_dup[a] = set()
    dict_dup[a].add(b)

    if b not in dict_dup:
        dict_dup[b] = set()
    dict_dup[b].add(a)

在此 运行 秒后,print(dict_dup) 输出

{22: {5, 590}, 5: {6000, 22}, 590: {22}, 6000: {5}}

我认为这就是您要查找的数据结构。

通过使用字典和集合,这段代码非常高效。它将 运行 在线性时间内超过 id 的数量。

使用 defaultdict 的代码更短

您还可以通过使用 defaultdict 而不是常规 dict 来缩短此代码,这将在需要时自动创建这些空集:

from collections import defaultdict

idA = [22, 22, 5]
idB = [5, 590, 6000]

dict_dup = defaultdict(set)
for a, b in zip(idA, idB):
    dict_dup[a].add(b)
    dict_dup[b].add(a)

打印语句产生的输出略有不同,但它是等价的:

defaultdict(<class 'set'>, {22: {5, 590}, 5: {6000, 22}, 590: {22}, 6000: {5}})

这仍然包含您想要的信息,并且与第一个解决方案一样高效。

将其放回您的数据框中

现在,如果您需要将此信息放回您的数据框中,您可以使用 dict_dup 高效地检索您要查找的每一行的内容。