Наполнить столбец при условии совпадения с другим значениями

У нас есть два массива, в одном, Df1, товары и их номера.

Description PN
SHAFT 333
ENGINE 444
ACTUATOR 555

В другом, Df2, на некоторые из номеров нам дали цену:

PN P
333 100
444 200

Хотим добавить значения столбца "Р" напротив столбца "PN".

list= []
for h in df1['PN']:
        for u in zip(df2['PN'], df2['P']):
             if h==u[0]:
                 list.append(u)
a = len(df1['PN'])
b = len(list)
c = a - b
df1['P'] = list(list[1]).extend(['']*c)

то есть мы, если значение из столбца P равно значению столбцу PN, сделали список кортежей из совпадающих значений, ввели новый столбец и выравняли его с длиной массива Дф1. Остаётся только ввести эти совпадающие значения из списка кортежей в новый столбец,

for h in list[0]:
    for u in df1['PN']:
        for j in list[1]:
            if h==u:
                df1['P'].append(j)

Объект нового столбца - серия, но машина выдаёт ошибку на строку с аппэнд, что int ne iterable. Как можно доставить значения из того списка кортежей в тот столбец? спасибо.


Ответы (2 шт):

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

Если вам надо объединить два дата фрейма, то почему не использовать метод join. Пример из документации:

df = pd.DataFrame({'pn': ['K0', 'K1', 'K2', 'K3', 'K4', 'K5'],
                   'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']})
other = pd.DataFrame({'pn': ['K0', 'K1', 'K2'],
                      'p': ['B0', 'B1', 'B2']})
df.join(other.set_index('pn'), on='pn')

'''

   pn   A    p
0  K0  A0   B0
1  K1  A1   B1
2  K2  A2   B2
3  K3  A3  NaN
4  K4  A4  NaN
5  K5  A5  NaN
→ Ссылка
Автор решения: MaxU

Можно воспользоваться методом DataFrame.merge():

res = df1.merge(df2, how="left")

результат:

In [12]: res
Out[12]:
  Description   PN      P
0       SHAFT  333  100.0
1      ENGINE  444  200.0
2    ACTUATOR  555    NaN

PS по умолчанию DataFrame.merge(other) объединяет фреймы по столбцам с совпадающими наименованиями.

→ Ссылка