Python:基于两个特性的独特组合和第3个featu上的一个条件来删除重复项

2024-04-26 10:40:28 发布

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

要解决的问题如下: 我有两个数据集,我想合并成一个。数据集没有公共键列。基于第1列和第2列的独特组合以及第3列的相似性,我想排除重复项。通过相似性,我的意思是数据集A中第3列的值仅略大于/小于数据集B中的值,例如,对于值20,范围[18,22]中的值是可接受的。举例说明:

数据集A:

 Col1 | Col2 | Col3 |
1 A   | A    | 10   |
2 B   | A    | 20   |
3 A   | B    | 10   |
4 B   | B    | 20   |

数据集B:

 Col1 | Col2 | Col3 |
1 A   | A    | 10   |
2 B   | A    | 21   |
3 A   | B    | 100  |
  • 第1行在两个数据集中完全相同,所以我只想在最后一个数据集中包含一行。你知道吗
  • 第1列和第2列在第2行中完全相同。但是,第3列中的值略有不同:20对21。我希望将这些行视为重复行,并且只包含一行,例如来自数据集A
  • 第1列和第2列在第3行中完全相同。但是,第3列中的值相差很大:10比100。我想在我的最终数据集中包括这两行。你知道吗
  • 数据集A中的第4行在数据集B中不存在,因此我想将其包含到我的最终数据集中。你知道吗

预期产量:

 Col1 | Col2 | Col3 |
1 A   | A    | 10   |
2 B   | A    | 20   |
3 A   | B    | 10   |
4 A   | B    | 100  |
5 B   | B    | 20   |

有没有计算复杂度低于O(n^2)[用每一行检查每一行]的方法?你知道吗


Tags: 数据方法相似性复杂度col2col3col1产量
1条回答
网友
1楼 · 发布于 2024-04-26 10:40:28

一个解决方案是创建数据集A的(Col1, Col2) -> Col3的映射。然后,B中的每一行可以查看映射,以查看数据集A中存在哪些Col3值具有相同的Col1Col2值。你知道吗

伪代码,因为我不熟悉pandas库:

from collections import defaultdict

def is_close(a, b):
    return abs(a-b) < some_value

d = defaultdict(list)
for col1, col2, col3 in A:
    d[(col1, col2)].append(col3)

for col1, col2, col3 in B:
    if not any(is_close(col3, x) for x in d[(col1, col2)]):
        add_to_result(col1, col2, col3)

defaultdict是必需的,因为col1col2中的行具有相同的值。这应该更快,因为创建映射是O(n),在B中的每个元素上循环应该只检查A中具有相同col1col2值的元素。你知道吗

相关问题 更多 >