Перезапись значения в датафрейме

Всем привет! Первый фрейм:

import pandas as pd, numpy as np
df = pd.DataFrame({'column1': ['name1', 'name2', 'name3'],
                   'column2': [100, 101, 102]})

Выход:

  column1  column2
0   name1      100
1   name2      101
2   name3      102

Второй фрейм:

df2 = pd.DataFrame({'column1': ['name1', 'name2', 'name3'],  
                   'column2': [1000, 2000, 3000]})

Выход:

  column1  column2
0   name1     1000
1   name2     2000
2   name3     3000

Задача: В df записать:

  • если column1 = name1 значение name1 из column2 из df2

  • для остальных сохранить изначальное значение

Хочу получить df:

  column1  column2
0   name1      1000
1   name2      101
2   name3      102

Мои решения. Первое решение:

df['Column2'] = df.apply(lambda x: (df.merge(df2, how = 'left', left_on=['column1'], right_on=['column1'])) if x['column1'] == 'name1' else x['column2'], axis=1)

Выдает:

  column1  column2                                            Column2
0   name1      100    column1  column2_x  column2_y
0   name1     ...
1   name2      101                                                101
2   name3      102                                                102

во-первых создает новую колонку, а не записывает в уже существующую, во-вторых при соблюдении условия записывается весь датафрейм, а не только значение "3000"

Второе решение:

new_results = {}
for index, row in df.iterrows():
    row["column_2"] = df.merge(df2, how = 'left', left_on=['column1'], right_on=['column1']) if row["column1"] == 'name1' else row["column2"]
    new_results[index] = dict(row)

df = pd.DataFrame.from_dict(new_results, orient='index')

результат такой же как у первого :( Если есть возможность показать решение обоими способами, понимаю, что проблема где-то в merge, но не могу понять как ее решить


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

Автор решения: strawdog
df.loc[df["column1"] == "name1", "column2"] = df2.loc[df2["column1"] == "name1", "column2"]
→ Ссылка