Заменить значения одного столбца в одном датафрейме значением по ключу из второго

Только начинаю разбираться в питоне, нужно решить прикладную задачку по работе.

Дано:

Две таблицы с общим полем 'Артикул', необходимо заменить значения во втором фрейме значениями из первого по артикулу.

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 шт):

Автор решения: strawdog

При исходных датафреймах:

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
→ Ссылка