сравнение данных из одного датафрейма в с данными в другом

Рейтинг: 1Ответов: 2Опубликовано: 13.06.2023

Есть две таблицы:

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
▲ 2

Не знаю, на сколько этот способ эффективен при большом объеме данных, но по скорости по идее должен быть быстрее 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 сек выполняется