Как сопоставить данные избегая дубликатов?
Есть файл CSV, с данными (каждая строка продублирована 4 раза):
|название товара|описание товара|цена товара|
|---------------|---------------|-----------|
|Весы MK_A20 |lorem |7000 |
|Весы MK_A20 |lorem |7000 |
|Весы MK_A20 |lorem |7000 |
|Весы MK_A20 |lorem |7000 |
|Весы MK_A11 |lorem |7000 |
|Весы MK_A11 |lorem |7000 |
|Весы MK_A11 |lorem |7000 |
|Весы MK_A11 |lorem |7000 |
|Весы MK_A21 |lorem |7000 |
|Весы MK_A21 |lorem |7000 |
|Весы MK_A21 |lorem |7000 |
|Весы MK_A21 |lorem |7000 |
...
И есть второй файл CSV c данными:
|название товара |
|----------------|
|Весы MK-3.2-A20 |
|Весы MK-6.2-A20 |
|Весы MK-15.2-A20|
|Весы MK-32.2-A20|
|Весы MK-3.2-A11 |
|Весы MK-6.2-A11 |
|Весы MK-3.2-A21 |
|Весы MK-6.2-A21 |
|Весы MK-15.2-A21|
...
Нужно сопоставить названия товара из двух этих файлов так, чтобы на выходе получился CSV и столбец название товара соответствовал столбцу из второй таблицы. То есть, на каждый вид весов MK_A20 есть несколько моделей - MK-3.2-A20, MK-6.2-A20, MK-15.2-A20, MK-32.2-A20. Для других видов весов моделей может быть другое кол-во но не больше 4-х как в примере выше, лишние строки удаляем:
|название товара |описание товара|цена товара|
|-----------------|---------------|-----------|
|Весы MK-3.2-A20 |lorem |7000 |
|Весы MK-6.2-A20 |lorem |7000 |
|Весы MK-15.2-A20 |lorem |7000 |
|Весы MK-32.2-A20 |lorem |7000 |
|Весы MK-3.2-A11 |lorem |7000 |
|Весы MK-6.2-A11 |lorem |7000 |
|Весы MK-3.2-A21 |lorem |7000 |
|Весы MK-6.2-A21 |lorem |7000 |
|Весы MK-15.2-A21 |lorem |7000 |
...
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
res = (d2
.assign(x=d2["название товара"].str.replace("\-[\d\.]*\-", "_", regex=True))
.merge(d1, left_on="x", right_on="название товара", suffixes=["","_2"])
.drop(columns=["x", "название товара_2"])
.drop_duplicates()
.reset_index(drop=True))
результат:
In [180]: res
Out[180]:
название товара описание товара цена товара
0 Весы MK-3.2-A20 lorem 7000
1 Весы MK-6.2-A20 lorem 7000
2 Весы MK-15.2-A20 lorem 7000
3 Весы MK-32.2-A20 lorem 7000
4 Весы MK-3.2-A11 lorem 7000
5 Весы MK-6.2-A11 lorem 7000
6 Весы MK-3.2-A21 lorem 7000
7 Весы MK-6.2-A21 lorem 7000
8 Весы MK-15.2-A21 lorem 7000