Формирование столбца Pandas на основе данных из двух таблиц при выполнении условий
Граждане, всю голову сломал. Знаний не хватает немного. Натолкните на мысль.
Дано:
- Таблица Output.xlsx откуда берется основа. Убираю не нужное, именую столбцы.
- Файл BD.csv, где находится дополнительная информация, на основе которой необходимо сделать дополнительные колонки в Таблице Output.xlsx
Задача:
Опираясь на картинку ниже пошагово
- Необходимо проверить у первого поставщика все заполненные поля с артикулами. Пустые поля пропускаются. И если у поле заполнено и стоит артикул, то необходимо проверить наличие товара в CSV файле.
- В CSV Файле сортируем, что бы выводились данные только нужного поставщика, т.к. артикулы разных поставщиков бывают одинаковыми.
- По артикулу (в нашем примере D001263) находим нужную нам строчку.
- Если товара нет в наличии, то возвращаемся на шаг 1 и проверяем следующий артикул. Если товар в наличии (len>0 или значение !=0), то:
- Из столбца 'ОПТ' берем оптовую стоимость и вставляем ее на место шага 6
- Когда столбец "Цена Attrade" будет заполнена, то переходим к следующему поставщику.
В итоге должно получиться 15 новых столбцов справа, т.е. столько же, сколько и самих поставщиков. И обязательно цена в новом столбце ставится только в том случае, если товар в наличии(Проверяем на 4 шаге).
import pandas as pd
import openpyxl
import numpy as np
import openpyxl
df = pd.read_excel('Output.xlsx', header=None).loc[1:, :]
df = df[[0, 10, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]]
df.rename(columns = {0:'Номер в Avito - Id', 10:'Название объявления - Title', 14:'Склад', 15:'Цена склада', 16:'Attrade', 17:'Slami', 18:'Invask', 19:'Proaudio', 20:'Arispro', 21:'Artimusic', 22:'Pop music', 23:'Roland', 24:'Okno-Audio', 25:'Grand', 26:'Lutner', 27:'LTM', 28:'Neva-sound', 29:'DJ Store', 30:'United Music', 31:'Итоговая цена'}, inplace = True)
fr = pd.read_csv('BD.csv')
with pd.ExcelWriter('Output.xlsx', engine="openpyxl", mode="a", if_sheet_exists='replace') as writer:
df.to_excel(writer, sheet_name="Processing", index=False)
Ответы (1 шт):
Вы много времени потратили на отрисовку алгоритма в картинках, а хотя бы часть исходных данных для примера приложить не подумали.
Предположим, у вас есть датафрейм goods (gname - название товара, art - артикул):
gname art
0 aaa 111
1 bbb 222
2 ccc 333
и датафрейм поставщиков suppliers (sname - имя поставщика, art - артикул, left - остаток):
sname art left
0 sup1 111 3
1 sup2 111 2
2 sup3 111 3
3 sup1 222 1
4 sup3 222 4
5 sup2 333 5
6 sup3 333 6
дальше делаем просто merge, фактически получая пересечение двух таблиц:
merged = pd.merge(goods, suppliers, how ='inner', on =['art'])
merge:
gname art sname left
0 aaa 111 sup1 3
1 aaa 111 sup2 2
2 aaa 111 sup3 3
3 bbb 222 sup1 1
4 bbb 222 sup3 4
5 ccc 333 sup2 5
6 ccc 333 sup3 6
теперь приводим к нужному виду:
res = merged.pivot(index=["gname", "art"], columns="sname", values="left")
получаем res:
sname sup1 sup2 sup3
gname art
aaa 111 3.0 2.0 3.0
bbb 222 1.0 NaN 4.0
ccc 333 NaN 5.0 6.0
