Поскольку вам не удалось предоставить текстовые данные для создания хотя бы фрагмента вашего DataFrame, я скопировал из вашей фотографии 3 строки, создав свой тестовый DataFrame:
df3 = pd.DataFrame(data=[
[ '1513452', 'AVRO D2', '685', 'BLACK/BLACK/ANTRACITE', '24', 929.95, '8052644627565' ],
[ '2513452', 'AVRO D2', '685', 'BLACK/BLACK/ANTRACITE', '21', 929.95, '8052644627565' ],
[ '2755126', 'AMELIA', 'Y17', 'DARK-DENIM', '24', 179.95, '8052644627565' ]],
columns=[ 'ITEM CODE', 'ITEM', 'COLOR', 'COLOR CODE', 'TG', 'PRICE', 'EAN' ])
Подробности:
- Первая строка не содержит ни одной из
catp
клавиш в столбце ITEM CODE
. - Вторая строка:
ITEM CODE
содержит один из ваших кодов ( 2513 ), но дляTG
столбец без кортежа сохранен в 2513
ключ содержит первый элемент == 21 . - В третьей строке:
ITEM CODE
содержит один из ваших кодов ( 2755 ), TG
== 24 и среди кортежей, сохраненных в 2755
, есть один == 24 .
Тогда мы должны определитьпара вспомогательных функций:
def findContainedCodeAndVal(dct, str):
for eachKey in dct.keys():
if str.find(eachKey) >= 0:
return (eachKey, dct[eachKey])
else:
return (None, None)
Эта функция пытается найти в dct
ключ, содержащийся в str
.Он возвращает 2-кортеж, содержащий найденный ключ и соответствующее значение из dct
.
def find2ndElem(tuples, str):
for tpl in tuples:
if tpl[0] == str:
return tpl[1]
else:
return ''
Эта функция проверяет каждый кортеж из tuples
, является ли его первый элемент == str
, и возвращает второй элементиз этого кортежа.
И последняя определяемая функция - это функция, которая будет применена к каждой строке в вашем DataFrame.Возвращает значение, которое будет сохранено в столбце SKU
:
def fn(row):
ind = row.name # Read row index
iCode = row['ITEM CODE']
k, val = findContainedCodeAndVal(catp, iCode)
codmarime = ''
if k:
tg = row.TG
codmarime = find2ndElem(val, tg)
if codmarime == '':
codmarime = '???'
return f'20/{iCode}/{ind}/{codmarime}'
Обратите внимание, что он использует ваш словарь catp
.
В демонстрационных целях я добавил в возвращаемое значение дополнительные косые черты, разделяя соседние части.В целевой версии удалите их.
И последнее, что нужно сделать, - это вычислить столбец SKU
вашего DataFrame, применив функцию fn
к каждой строке df3
и сохранив результат в SKU
столбец:
df3['SKU'] = df3.apply(fn, axis=1)
Когда вы печатаете DataFrame (содержащий мои тестовые данные), столбец SKU
будет содержать:
20/1513452/0/???
20/2513452/1/???
20/2755126/2/002