Совпадение слов в двух DataFrame
Есть два DataFrame: a - исходные строки, в которых нужно искать совпадение
b - cписок, из которого нужно взять значение из колонки Brand_custom и в случае совпадения слова подставить значение из колонки Brand
a = {'file_brand': ['Производитель PERFECT COLOURANTS AND PLASTICS PVT. LTD. тов. знак A-LEN TECH артикул AD 1290 кол-во=384',
'Производитель SABIC PETROCHEMICALS B.V. тов. знак SABIC марка ОТСУТСТВУЕТ',
'Производитель TIANJIN ENERGY MASTER TECHNOLOGY CO., LTD тов. знак ОТСУТСТВУЕТ артикул YM20230801 кол-во=19.36',
'Производитель "SK CORP.", КОРЕЯ РЕСП. тов. знак "SK"',
'Производитель KH MOTORSPARTS CO.LTD тов. знак MOBIS марка MOBIS артикул SP-IV RR модель ATF кол-во=360',
'Производитель AKITA KAIHATSU G.K. тов. знак NGN марка NGN артикул V182575116 модель NGN A-LINE 5W-30 кол-во=80',
'Производитель ANGLO INTERNATIONAL MINING B.V. тов. знак AIMOL марка AIMOL артикул 8717662391033 модель AIMOL X-COOL CONCENTRATE 3122 кол-во=20',
'Производитель WD-40 COMPANY LTD тов. знак WD-40 марка WD-40 артикул ОТСУТСТВУЕТ модель WD-40 кол-во=3792',
'Производитель TURCAS PETROL A.S. тов. знак SMARTOIL марка ОТСУТСТВУЕТ артикул 11028256 модель SMARTOIL 3000 кол-во=48',
'Производитель COLUMBIA PETRO CHEM PVT LTD тов. знак ОТСУТСТВУЕТ марка 15 USP артикул ОТСУТСТВУЕТ модель 15 USP кол-во=11.90']}
b = {'Brand_custom': ['A-LEN TECH', 'SABIC', 'SK', 'MOBIS', 'NGN', 'AIMOL', 'SMARTOIL'],
'Brand': ['A-LEN TECH', 'SABIC', 'SK', 'MOBIS', 'NGN', 'AIMOL', 'SMARTOIL']}
Но код выдает значение только для первой строки, а остальные "-"
df = pd.DataFrame(data=a)
brand_df = pd.DataFrame(data=b)
df['Corr_Brand'] = ''
def check_Brand(row):
for i in range(brand_df.shape[0]):
if brand_df.loc[i]['Brand_custom'] in row['file_brand']:
return brand_df.loc[i]['Brand']
else:
return '-'
df['Corr_Brand'] = df.apply(check_Brand, axis = 1)
Ответы (3 шт):
Ну видимо возврат отрицательного результата нужно делать после окончания цикла, а не после первой же не удавшейся проверки:
def check_Brand(row):
for i in range(brand_df.shape[0]):
if brand_df.iloc[i]['Brand_custom'] in row['file_brand']:
return brand_df.iloc[i]['Brand']
# все бренды проверили, совпадений нет
return '-'
Может быть, просто сделать маппер и замену?
mapper = dict(zip(*b.values()))
df['Corr_Brand'] = df['file_brand'].apply(lambda x:
next(iter([val for key, val in mapper.items()
if key in x]),"-"))
print(df)
file_brand Corr_Brand
0 Производитель PERFECT COLOURANTS AND PLASTICS ... A-LEN TECH
1 Производитель SABIC PETROCHEMICALS B.V. тов. з... SABIC
2 Производитель TIANJIN ENERGY MASTER TECHNOLOGY... -
3 Производитель "SK CORP.", КОРЕЯ РЕСП. тов. зна... SK
4 Производитель KH MOTORSPARTS CO.LTD тов. знак ... MOBIS
5 Производитель AKITA KAIHATSU G.K. тов. знак NG... NGN
6 Производитель ANGLO INTERNATIONAL MINING B.V. ... AIMOL
7 Производитель WD-40 COMPANY LTD тов. знак WD-4... -
8 Производитель TURCAS PETROL A.S. тов. знак SMA... SMARTOIL
9 Производитель COLUMBIA PETRO CHEM PVT LTD тов.... -
Регуляркой извлекаем вхождения меток брендов. Где они есть - появляется ключ-метка, где нет - NaN. Далее просто заменяем ключи-метки по словарю на названия брендов, который делаем путем преобразования из b. NaN'ы заменяем на -.
df['Corr_Brand'] = df['file_brand'].str.extract('(' + '|'.join(b['Brand_custom']) + ')').replace({k: v for k, v in zip(b['Brand_custom'], b['Brand'])}).fillna('-')
file_brand Corr_Brand
0 Производитель PERFECT COLOURANTS AND PLASTICS PVT. LTD. тов. знак A-LEN TECH артикул AD 1290 кол-во=384 A-LEN TECH
1 Производитель SABIC PETROCHEMICALS B.V. тов. знак SABIC марка ОТСУТСТВУЕТ SABIC
2 Производитель TIANJIN ENERGY MASTER TECHNOLOGY CO., LTD тов. знак ОТСУТСТВУЕТ артикул YM20230801 кол-во=19.36 -
3 Производитель "SK CORP.", КОРЕЯ РЕСП. тов. знак "SK" SK
4 Производитель KH MOTORSPARTS CO.LTD тов. знак MOBIS марка MOBIS артикул SP-IV RR модель ATF кол-во=360 MOBIS
5 Производитель AKITA KAIHATSU G.K. тов. знак NGN марка NGN артикул V182575116 модель NGN A-LINE 5W-30 кол-во=80 NGN
6 Производитель ANGLO INTERNATIONAL MINING B.V. тов. знак AIMOL марка AIMOL артикул 8717662391033 модель AIMOL X-COOL CONCENTRATE 3122 кол-во=20 AIMOL
7 Производитель WD-40 COMPANY LTD тов. знак WD-40 марка WD-40 артикул ОТСУТСТВУЕТ модель WD-40 кол-во=3792 -
8 Производитель TURCAS PETROL A.S. тов. знак SMARTOIL марка ОТСУТСТВУЕТ артикул 11028256 модель SMARTOIL 3000 кол-во=48 SMARTOIL
9 Производитель COLUMBIA PETRO CHEM PVT LTD тов. знак ОТСУТСТВУЕТ марка 15 USP артикул ОТСУТСТВУЕТ модель 15 USP кол-во=11.90 -
Если словарь замен сразу сделать вида метка:бренд, то его можно применять без преобразования.
Ниже - более оптимальный код - если сделать словарь сразу более удобным:
b = {'A-LEN TECH': 'A-LEN TECH', 'SABIC': 'SABIC', 'SK': 'SK', 'MOBIS': 'MOBIS', 'NGN': 'NGN', 'AIMOL': 'AIMOL', 'SMARTOIL': 'SMARTOIL'}
df['Corr_Brand'] = df['file_brand'].str.extract(f'({"|".join(b.keys())})').replace(b).fillna('-')