Как объединить несколько фреймов без добавления колонок с префиксом?

Есть фреймы данных (в примере 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 шт):

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

Исходные данные:

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