сравнение данных из одного датафрейма в с данными в другом
Есть две таблицы:
table1
| номер |
|---|
| 2877348604945 |
| 2654787454945 |
| 2877325684945 |
| 1568565685656 |
| 5623565432565 |
table2
| номер |
|---|
| 2877348123587 |
| 2654722121211 |
| 2877325620121 |
| 1568561212121 |
| 5623565232323 |
Результат table 3
номер_t2 - данные из таблицы 2
префикс - сравниваются номера из таблицы 2 с номерами из таблицы 1 слева направо. Равна той части которая совпадает + 1 символ
н/р: 2877348123587 сравнивается с 2877348604945. Результат 28773481.
| номер_t2 | префикс |
|---|---|
| 2877348123587 | 28773481 |
| 2654722121211 | 265472 |
| 2877325620121 | 287732562 |
| 1568565685656 | 1568565 |
| 5623565232323 | 56235652 |
Ответы (2 шт):
Если сравнение идет строго построчно, то можно сделать так, например:
import pandas as pd
from difflib import SequenceMatcher
# исходные данные
l1 = ["2877348604945", "2654787454945", "2877325684945", "1568565685656", "5623565432565"]
l2 = ["2877348123587", "2654722121211", "2877325620121", "1568561212121", "5623565232323"]
df1 = pd.DataFrame(l1, columns=["номер1"])
df2 = pd.DataFrame(l2, columns=["номер2"])
# объединяем в один датафрейм:
df = pd.concat([df1, df2], axis=1)
def get_last_match(a):
return SequenceMatcher(None, a["номер1"], a["номер2"]).find_longest_match().size+1
df["префикс"] = df.apply(lambda x: x["номер2"][:get_last_match(x)], axis=1)
df:
номер1 номер2 префикс
0 2877348604945 2877348123587 28773481
1 2654787454945 2654722121211 265472
2 2877325684945 2877325620121 287732562
3 1568565685656 1568561212121 1568561
4 5623565432565 5623565232323 56235652
Не знаю, на сколько этот способ эффективен при большом объеме данных, но по скорости по идее должен быть быстрее apply(), за счет векторизации:
def prefer(x, y):
if str(y) == 'nan':
return 0
else:
s = 1
for i in range(0, len(str(y))):
if str(y)[i]==str(x)[i]:
s +=1
else:
break
return int(str(y)[0:s])
df['prefix'] = np.vectorize(prefer)(df['номер1'], df['номер2'])
ПС. я не знаю в каком формате данные в таблице int или str, но столбец prefix будет в формате int, если надо поменять, то напишите)
ПС2. проверил на 5млн строк-где то за 25 сек выполняется