Как сравнить две таблицы по данным сразу 3х столбцов?

У меня есть код, как объединить две таблицы, по одному столбцу. А мне нужно сделать тоже самое, только сравнивать нужно сразу же с данными из 3х столбцов.

Возможно ли это?

То есть, смысл задачи такой - Если A, Target A, Target_B в первой таблице совпадают с A, Target A, Target_B второй таблицы, добавить в первую таблицу EXT_ID.

Первая таблица

Вторая таблица

Пример кода для сравнения двух таблиц по одному столбцу:

import pandas as pd
data = pd.read_excel('C:\Pyton\File for open\HO_Test.xlsx')
datasql = pd.read_excel('C:\Pyton\File for open\SQL_BD.xlsx')
data = data.merge(datasql,how='left',left_on='Cell_ID',right_on='Cell_ID')
with pd.ExcelWriter('C:\Pyton\File for open\HO.xlsx', engine='openpyxl', mode='a') as writer:
    data.to_excel(writer,sheet_name='LTE>2G', index=0)

Ссылка на .xlsx файлы с таблицами 1 и 2.


Ответы (2 шт):

Автор решения: CrazyElf

Создайте в обоих датафреймах столбец с Cell_ID по которому будете делать объединение. Приблизительно так:

df1['Cell_ID'] = df1['A'] + '_' + df1['Target A'] + '_' + df1['Target_B']
df2['Cell_ID'] = df2['A'] + '_' + df2['Target A'] + '_' + df2['Target_B']

Дальше делаете merge по Cell_ID также как у вас в примере.

Наверняка есть способ ещё проще, но такой вроде должен работать наверняка.

→ Ссылка
Автор решения: MaxU

Достаточно указать список столбцов по которым вы хотите объединить фреймы:

res = data.merge(datasql, on=["A", "Target_A", "Target_B"], how='left')

или для приведенных по ссылкам данных:

res = data.merge(datasql, how='left')

т.к. по умолчанию, DataFrame.merge() делает объединение по всем столбцам, для которых имена совпадают в обоих фреймах.


результат:

In [24]: res.loc[res["Ext_ID"].notna()]
Out[24]:
        A        B        C        D      E              F      G        H  Target_A  Target_B  Target_C  Target_D  Target_E       Target_F  Target_G  Target_H  Ext_ID
7   187.0  56907.0  56901.0  18860.0  160.0            СРТ  333.0  10762.0     112.0    3681.0       NaN   18860.0      10.0            СРТ      55.0      72.0   368_1
8   187.0  56907.0  56901.0  18860.0  160.0            СРТ  333.0  10762.0     112.0    3682.0       NaN   18860.0      10.0            СРТ      74.0      55.0   368_2
9   187.0  56907.0  56901.0  18860.0  160.0            СРТ  333.0  10762.0     112.0    3683.0       NaN   18860.0      10.0            СРТ      37.0      82.0   368_3
10  187.0  56907.0  56901.0  18860.0  160.0            СРТ  333.0  10762.0     112.0   23681.0       NaN   18860.0      10.0            СРТ      20.0     865.0  2368_1
11  187.0  56907.0  56901.0  18860.0  160.0            СРТ  333.0  10762.0     112.0   23682.0       NaN   18860.0      10.0            СРТ      35.0     867.0  2368_2
12  187.0  56907.0  56901.0  18860.0  160.0            СРТ  333.0  10762.0     112.0   23683.0       NaN   18860.0      10.0            СРТ      66.0     871.0  2368_3
13  187.0  56908.0  56902.0  18860.0  160.0            СРТ  334.0  10762.0     112.0    3681.0       NaN   18860.0      10.0            СРТ      55.0      72.0   368_1
14  187.0  56908.0  56902.0  18860.0  160.0            СРТ  334.0  10762.0     112.0    3682.0       NaN   18860.0      10.0            СРТ      74.0      55.0   368_2
15  187.0  56908.0  56902.0  18860.0  160.0            СРТ  334.0  10762.0     112.0    3683.0       NaN   18860.0      10.0            СРТ      37.0      82.0   368_3
16  187.0  56908.0  56902.0  18860.0  160.0            СРТ  334.0  10762.0     112.0   23681.0       NaN   18860.0      10.0            СРТ      20.0     865.0  2368_1
17  187.0  56908.0  56902.0  18860.0  160.0            СРТ  334.0  10762.0     112.0   23682.0       NaN   18860.0      10.0            СРТ      35.0     867.0  2368_2
18  187.0  56908.0  56902.0  18860.0  160.0            СРТ  334.0  10762.0     112.0   23683.0       NaN   18860.0      10.0            СРТ      66.0     871.0  2368_3
19  187.0  56909.0  56903.0  18860.0  160.0            СРТ  335.0  10762.0     112.0    3681.0       NaN   18860.0      10.0            СРТ      55.0      72.0   368_1
20  187.0  56909.0  56903.0  18860.0  160.0            СРТ  335.0  10762.0     112.0    3682.0       NaN   18860.0      10.0            СРТ      74.0      55.0   368_2
21  187.0  56909.0  56903.0  18860.0  160.0            СРТ  335.0  10762.0     112.0    3683.0       NaN   18860.0      10.0            СРТ      37.0      82.0   368_3
22  187.0  56909.0  56903.0  18860.0  160.0            СРТ  335.0  10762.0     112.0   23681.0       NaN   18860.0      10.0            СРТ      20.0     865.0  2368_1
23  187.0  56909.0  56903.0  18860.0  160.0            СРТ  335.0  10762.0     112.0   23682.0       NaN   18860.0      10.0            СРТ      35.0     867.0  2368_2
24  187.0  56909.0  56903.0  18860.0  160.0  KIE_CHN_BBR_U  335.0  10762.0     112.0   23683.0       NaN   18860.0      10.0  KIE_CHN_BBR_D      66.0     871.0  2368_3
25  187.0  50041.0  50041.0  18860.0  160.0  KIE_CHN_BB2_U  284.0  10712.0     112.0    3681.0       NaN   18860.0      10.0  KIE_CHN_BBR_G      55.0      72.0   368_1
→ Ссылка