使用充满重复项的列表替换 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}]
这是我的问题。基本上,我有一个包含很多比较的数据框。 当 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}]