2017-06-19 43 views
4

要解決的問題如下: 我有兩個要合併爲一個的數據集。數據集沒有公共密鑰列。我希望根據第1列和第2列的唯一組合以及第3列的相似性排除重複項。通過相似性,我的意思是數據集A中第3列的值僅略大於數據集B中的值,例如,對於值20,來自範圍[18,22]的值是可接受的。一個例子更清楚:Python:基於兩個特徵的獨特組合以及第三個特徵的條件刪除重複

數據集:

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 vs 21.我想將這些行作爲重複對象並僅包括一行,例如,來自數據集A
  • 列1和列2在第3行中完全相同。但是,第3列中的值爲極其不同:10 vs 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)[檢查與每一行的每一行]?

+1

你有5%的「略」的數學定義嗎?或+/-三個單位內? 「稍微」一些更具體和可編程的東西。謝謝。 –

+1

加上@ ScottBoston的問題,'咯'的可能定義很可能不是傳遞的。當行k&m和行m&n稍有不同時會發生什麼情況,但行k和n有很大不同? – EFT

回答

0

的溶液可以是創建的數據集A.然後在乙的每一行可以看在映射以查看哪個Col3值數據集A的存在具有相同Col1Col2(Col1, Col2) -> Col3的映射。

僞因爲我沒有與pandas庫familiair:因爲是在一個行與col1col2相同的值

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是必需的。這應該會更快,因爲創建映射是O(n),並且循環遍歷B中的每個元素應僅檢查A中具有相同col1col2值的元素。