Как сравнить две таблицы по данным сразу 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 шт):
Создайте в обоих датафреймах столбец с 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 также как у вас в примере.
Наверняка есть способ ещё проще, но такой вроде должен работать наверняка.
Достаточно указать список столбцов по которым вы хотите объединить фреймы:
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

