从成对列表开始替换列中值的有效方法
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
是否可以提高效率?
我必须在这里做一些猜测,因为你的问题不是很清楚,但我的理解是,你想要一个字典,将 idA
或 idB
中的每个 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 高效地检索您要查找的每一行的内容。
我正在尝试替换数据中的重复项,我正在寻找一种有效的方法来做到这一点。
我有一个包含 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
是否可以提高效率?
我必须在这里做一些猜测,因为你的问题不是很清楚,但我的理解是,你想要一个字典,将 idA
或 idB
中的每个 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 高效地检索您要查找的每一行的内容。