Заменить значения одного столбца в одном датафрейме значением по ключу из второго
Только начинаю разбираться в питоне, нужно решить прикладную задачку по работе.
Дано:
Две таблицы с общим полем 'Артикул', необходимо заменить значения во втором фрейме значениями из первого по артикулу.
df55 - склад
df1C = общая сводка
Пример:
df55 = pd.DataFrame(
{'Название':['Коврик для фитнесса голубой 10', 'Коврик для фитнесса 10 мм NBR фиолетовый', 'Гиря 16 кг', 'Блины 10кг','Фибол'],
'Артикул':['SV-HK0067','SV-HK0068', 'SV-HK0069','SV-HK0070','SV-HK0071'],
'Количество':['5', '7', '2', '4','6']})
df1С1 = pd.DataFrame(
{'Название':['Коврик для фитнесса голубой 10', 'Коврик для фитнесса 10 мм NBR фиолетовый', 'Гиря 16 кг', 'Блины 10кг','Фибол','Перчатки','Груши'],
'Артикул':['SV-HK0067','SV-HK0068', 'SV-HK0069','SV-HK0070','SV-HK0071', 'SV-HK0072', 'SV-HK0073'],
'Склад 55 к-во':['3', '4', '5', '6','8','0','0'], 'Склад 43 к-во':['0', '0', '0', '0','0','0','0'], 'Склад 72 к-во':['0', '0', '0', '0','0','0','0']})
В итоге нужна общая сводка с измененным количеством в соответствии с данными по складу.
Пробовал такой вариант:
df_new = df55.loc[:, ['Артикул', 'Кол-во ']].set_index('Артикул')
dict_1 = df_new.to_dict()
df1C = (df1C
.query("'Артикул' in @dict_1.keys()")
.assign(Артикул=lambda x: x["55"].replace(dict_1)))
Выдает ошибку TypeError: unhashable type: 'list' Понимаю, что скорее всего есть более простой вариант т.к. задача элементарная. Заранее спасибо за помощь!
Ответы (1 шт):
При исходных датафреймах:
df55:
Название Артикул Количество
0 Коврик для фитнесса голубой 10 SV-HK0067 5
1 Коврик для фитнесса 10 мм NBR фиолетовый SV-HK0068 7
2 Гиря 16 кг SV-HK0069 2
3 Блины 10кг SV-HK0070 4
4 Фибол SV-HK0071 6
df1C1:
Название Артикул Склад 55 к-во
0 Коврик для фитнесса голубой 10 SV-HK0067 3
1 Коврик для фитнесса 10 мм NBR фиолетовый SV-HK0068 4
2 Гиря 16 кг SV-HK0069 5
3 Блины 10кг SV-HK0070 6
4 Фибол SV-HK0071 8
5 Перчатки SV-HK0072 0
6 Груши SV-HK0073 0
вы можете сделать просто:
df1С1.update(df55.rename(columns={"Количество": "Склад 55 к-во"}))
Обратите внимание, что мне пришлось переименовывать колонки, потому что они у вас в датафреймах не совпадают.
тогда df1C1 получится:
Название Артикул Склад 55 к-во
0 Коврик для фитнесса голубой 10 SV-HK0067 5
1 Коврик для фитнесса 10 мм NBR фиолетовый SV-HK0068 7
2 Гиря 16 кг SV-HK0069 2
3 Блины 10кг SV-HK0070 4
4 Фибол SV-HK0071 6
5 Перчатки SV-HK0072 0
6 Груши SV-HK0073 0
UPDATE
Если я все-таки правильно понял автора вопроса, и обновлять датафрейм нужно по паре ключ-значение, соответсвующей Артикулу-Количеству, то сделать можно так (для наглядности я поменял местами первые позиции в df1C1:
df55:
Название Склад 55 к-во
Артикул
SV-HK0067 Коврик для фитнесса голубой 10 3
SV-HK0068 Коврик для фитнесса 10 мм NBR фиолетовый 4
SV-HK0069 Гиря 16 кг 5
SV-HK0070 Блины 10кг 6
SV-HK0071 Фибол 8
SV-HK0072 Перчатки 0
SV-HK0073 Груши 0
Название Склад 55 к-во
df1C1:
Артикул
SV-HK0068 Коврик для фитнесса 10 мм NBR фиолетовый 5
SV-HK0067 Коврик для фитнесса голубой 10 7
SV-HK0069 Гиря 16 кг 2
SV-HK0070 Блины 10кг 4
SV-HK0071 Фибол 6
res = df1С1.set_index("Артикул")
upd = df55.rename(columns={"Количество": "Склад 55 к-во"}).set_index("Артикул")
res.update(upd)
res = res.reset_index()
тогда res будет:
Артикул Название Склад 55 к-во
0 SV-HK0067 Коврик для фитнесса голубой 10 7
1 SV-HK0068 Коврик для фитнесса 10 мм NBR фиолетовый 5
2 SV-HK0069 Гиря 16 кг 2
3 SV-HK0070 Блины 10кг 4
4 SV-HK0071 Фибол 6
5 SV-HK0072 Перчатки 0
6 SV-HK0073 Груши 0