Python:基于两个特征的独特组合和第三个特征的条件删除重复项

Posted

技术标签:

【中文标题】Python:基于两个特征的独特组合和第三个特征的条件删除重复项【英文标题】:Python: Removing Duplicates based on unique combination of two features and a condition on 3rd feature 【发布时间】:2017-11-21 19:06:54 【问题描述】:

要解决的问题如下: 我有两个要合并为一个的数据集。数据集没有公共键列。我想根据第 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 行完全相同,因此我只想在最终数据集中包含一行。 第 2 行中的第 1 列和第 2 列完全相同。但是,第 3 列中的值 略有 不同:20 与 21。我想将这些行视为重复行并仅包含一行,例如来自数据集 A 第 3 行中的第 1 列和第 2 列完全相同。但是,第 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)的方法【用每一行检查每一行】?

【问题讨论】:

你有5%以内“稍微”的数学定义吗?或在+/-三个单位内?比“稍微”更具体和可编程的东西。谢谢。 补充到@ScottBoston 的问题,“轻微”的最可能定义可能不是传递性的。当第 k & m 行和 m & n 行略有不同,但第 k & n 行差异极大时,会发生什么情况? 【参考方案1】:

一种解决方案可以是创建数据集 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 是必需的,因为 A 中存在具有相同值的行 col1col2。这应该更快,因为创建映射是 O(n) 并且循环 B 中的每个元素应该只检查 A 中具有相同 col1col2 值的元素。

【讨论】:

以上是关于Python:基于两个特征的独特组合和第三个特征的条件删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

Python机器学习及实践——进阶篇2(特征提升之特征筛选)

特征组合--组合独热矢量

人脸检测——基于机器学习2Haar特性

MLCC - 09特征组合 (Feature Crosses)

维度规约(特征的提取和组合)

sklearn 特征联合