как по условию (значение в столбце) искать подстроки в другом столбце на Python циклично
Здраствуйте, нужно сделать поиск подстроки в строке по условию во втором столбце. У меня есть 2 dataframe:
df1 = {'Descr': ["VALVE, PRESSURE", "pump ttf", "Valve, electrical", "Geeku, electrical","VALVE, OVERBOARD, BUTTERFLY"],
'N_Product': ["VALVE", "PUMP", "VALVE", "GEEKU","VALVE"],
}
df2 = {'N_Product': ["VALVE", "VALVE","VALVE", "PUMP", "GEEKU"],
'M_Product': ["PRESSURE", "BUTTERFLY","", "", "MBA"],
}
df1 = pd.DataFrame(df1)
df2 = pd.DataFrame(df2)
нужно сравнить значения из колонок N_Product из двух dataframe, если они совпадают, то выполнить поиск соответствующих значений из колонки M_Product(например для Valve - есть 3 соответствия: "PRESSURE", "ELECTRICAL" и ""(пустое значение) в столбце Descr, если оно там есть, то добавить в столбец Result. Для поиска подстрок в строке использую такой код:
c = df2['M_Product'].astype(str).to_list()
def matcher(x):
for i in c:
if i.lower() in x.lower():
return i
else:
return np.nan
df1['Res'] = df1['Descr'].apply(matcher)
но не знаю как циклически использовать значения только соответствующих M_Product для N_Product.
Желаемый результат:
Буду благодарен за любую помощь)
Ответы (1 шт):
Прямо как у вас не получилось, но вот вам заготовка, сами доработайте:
df3 = df1.merge(df2, on='N_Product')
df4 = df3[df3.apply(lambda x: x.M_Product != '' and x.M_Product.lower() in x.Descr.lower(), axis=1)]
df5 = df3[(df3.apply(lambda x: x.M_Product == '' and x.M_Product.lower() in x.Descr.lower(), axis=1)) & ~(df3.index.isin(df4.index))]
df6 = pd.concat([df4,df5])
В df6:
| Descr | N_Product | M_Product | |
|---|---|---|---|
| 0 | VALVE, PRESSURE | VALVE | PRESSURE |
| 7 | VALVE, OVERBOARD, BUTTERFLY | VALVE | BUTTERFLY |
| 2 | VALVE, PRESSURE | VALVE | |
| 5 | Valve, electrical | VALVE | |
| 8 | VALVE, OVERBOARD, BUTTERFLY | VALVE | |
| 9 | pump ttf | PUMP |
Как у вас сматчилось MBA я не понял, у меня не сматчилось.
Ну и ещё нужно подумать, как лишнее убрать. Но приёмы маскирования строк можете эти использовать, просто нужно подумать как правильно скомбинировать условия. Пустые строки сильно всё портят, нужно потом лишнее грамотно убирать, я до конца не довёл.
