Как объединить несколько фреймов без добавления колонок с префиксом?
Есть фреймы данных (в примере 2, а так больше). Хочу склеить их по значению конкретной колонки, но чтобы у меня не создавались лишние колонки (должна быть перезапиь значений по условию):
df1 = pd.DataFrame(
{
"col1": ["bla1", "bla2"],
"col2": ["option1", "option2"],
"name": ["name1", "name2"]
}
)
df2 = pd.DataFrame(
{
"col1": ["bla101", "bla3"],
"col4": ["val1", "val2"],
"name": ["name1", "name5"]
}
)
df1.merge(df2, on='name', how='outer')
После объединения на выходе получаю 5 колонок:
['col1_x', 'col2', 'name', 'col1_y', 'col4']
, однако я хочу видеть 4 колонки (3 из первого фрейма и 1 новую из 2-го).
В голову приходит только хардкод - выписывать все необходимые имена колонок и по ним формировать новый фрейм данных.
Хочется видеть что-то вроде такого:
name | col1 | col2 | col4
name1| bla1 | option1| val1
name2| bla2 | option2| NaN
name5| bla3 | NaN | val2
Если в 1-ом фрейме для объекта в какой-то колонке есть значение и в такой же колонке для того же объекта в другом фрейме есть значение, надо оставлять значение из 1-го фрейма. Здесь в примере name == name1 в обоих фреймах есть значения в колонке col1 - bla1 и bla101 соотв., надо оставить значение из 1-го фрейма - bla1
Такое вообще реально сделать?
Ответы (1 шт):
Исходные данные:
In [115]: df1
Out[115]:
col1 col2 name
0 bla1 option1 name1
1 bla2 option2 name2
In [116]: df2
Out[116]:
col1 col2 col4 name
0 bla101 aaa val1 name1
1 bla3 bbb val2 name5
гибкое решение для всех столбцов с совпадающими именами:
res = df1.merge(df2, on='name', how='outer', suffixes=["", "_drop"])
drop_cols = res.columns.str.contains("_drop$")
res = (res
.loc[:, ~drop_cols]
.fillna(res.loc[:, drop_cols]
.rename(columns=lambda c: c.replace("_drop", ""))))
результат:
In [118]: res
Out[118]:
col1 col2 name col4
0 bla1 option1 name1 val1
1 bla2 option2 name2 NaN
2 bla3 bbb name5 val2