Я приведу вам пример, чтобы убедиться, как вы можете действовать, и какова причина наблюдаемого вами поведения:
Во-первых, давайте построим наши образцы данных
df1 = pd.DataFrame(np.random.randint(1,3,size=(3,3)),columns=['a1','x1','x2'])
Выход
a1 x1 x2
0 1 2 1
1 2 1 1
2 1 2 2
Теперь другой фрейм данных
df2 = pd.DataFrame(np.random.randint(1,3,size=(3,3)),columns=['a2','x1','x2'])
a2 x1 x2
0 2 2 1
1 1 2 2
2 1 1 2
Теперь, если мы объединяем только (!) Один из индексов, которые встречаются в обоих фреймах данных, то pandas хочет, чтобы вы могли восстановить, из какого фрейма данных первоначально пришел индекс
pd.merge(df1,df2, on='x1')
выход
a1 x1 x2_x a2 x2_y
0 1 2 1 2 1
1 1 2 1 1 2
2 1 2 2 2 1
3 1 2 2 1 2
4 2 1 1 1 2
Теперь самый простой способ избавиться от этого - удалить один из двойных столбцов в одном из фреймов данных:
pd.merge(df1[df1.columns.drop('x2')], df2, on='x1')
выход
a1 x1 a2 x2
0 1 2 2 1
1 1 2 1 2
2 1 2 2 1
3 1 2 1 2
4 2 1 1 2
Но вы также можете объединить список столбцов. Обратите внимание, что здесь мы выполняем внутреннее соединение, которое может значительно уменьшить количество строк в выходном фрейме данных (или даже привести к пустым фреймам данных, если в обоих столбцах нет совпадений)
pd.merge(df1,df2, on=['x1','x2'])
a1 x1 x2 a2
0 1 2 1 2
1 1 2 2 1