Перезапись значения в датафрейме
Всем привет! Первый фрейм:
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"]