Выполнить слияние на основе совпадения подстроки? - PullRequest
0 голосов
/ 26 мая 2018

Хотя этот вопрос тесно связан с Fuzzy Match Merge с пандами , этот вопрос конкретно касается слияния only (или подмножества, в данном случае), когда вводится одна DataFrame - полное совпадение или подстрока ключа в другом DataFrame.Чтобы проиллюстрировать мою точку зрения, вот 2 DataFrames:

df1
   id   code
0   1   E282
1   2  O0080
2   3    R52
3   4  J0100
4   5    F99

df2
    code  val
0   V282   11
1   O008   12
2  J0101   13
3    F99   14
4    R55   15

Проблема с использованием difflib состоит в том, что я действительно не хочу сопоставлять ближайшую строку, и я не уверен, что 'мог бы разделять совпадения, такие как V282 - E282, что не должно происходить, и совпадения, такие как O008 - O0080, которые должны объединяться.

Ожидаемый результат должен быть

   code1  id
0  O0080   2
1    F99   5

. Я могу получить этот результат с помощью

import numpy as np
df1[np.logical_or.reduce([df1['code'].str.contains(code) for code in df2.code.tolist()])]

, но поскольку df1 имеет длину 42M строк, а df2 содержит~ 4000 кодов, этот метод невероятно медленный.Это лучшее, что я собираюсь сделать?Просто кажется прискорбным, когда внутреннее объединение строки 21M df и строки 7M df для точных ключей занимает <1 минуту.</p>

1 Ответ

0 голосов
/ 26 мая 2018

Это сложная проблема.Может быть, рассмотреть подход Python?any будет иметь здесь короткое замыкание, поэтому вы должны сэкономить на некоторых циклах.Кроме того, contains не обязательно проверяет с самого начала, поэтому использование startswith должно быть более эффективным.

df1[
    any(
         i.startswith(j) for j in df2.codes.tolist()
    ) for i in df1.codes.tolist()
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...