merge в Python: не работает при разных типах данных

объединяю 2 датафрейма, и у них разные типы данных в столбцах, хотя dtypes показывает, что все норм. Пример кода:

data = {'col1': ['val1','val2', 'val3'], 
        'col2': ['123','text', 345]}
data2 = {'col3': ['val1','val2', 'val3'], 
        'col4': ['312','text', '345']}
df = pd.DataFrame(data)
df2 = pd.DataFrame(data2)

специально меняю тип всего столбца, чтобы значение 345 в col2 стало строкой.

df['col2'].astype('str', copy=False)

мерджу

pd.merge(df, df2, left_on='col2', right_on='col4', how='outer')

Но все равно не совмещает 1 строку:

    col1    col2    col3    col4
0   val1    123     NaN     NaN
1   val2    text    val2    text
2   val3    345     NaN     NaN
3   NaN     NaN     val1    312
4   NaN     NaN     val3    345

2 и 4 строки должны быть совмещены. Как этого добиться?

В работе датафреймы с сотнями тысячами строк.


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

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

Естественно, изменённые данные нужно записать обратно в колонку, вы же результат никуда не записываете:

df['col2'] = df['col2'].astype('str')

P.S. Я убрал copy=False, не могу точно сказать, почему у вас с ним не работает без присваивания, но использование этого параметра в документации сопровождается предупреждением и лучше с ним не экспериментировать. Вообще, операции через точку в Pandas часто работают на копии данных, поэтому лучше все присвоения делать в явном виде, не используя изменения "на месте" (inplace).

Другой вариант - указать сразу тип данных в явном виде, чтобы потом не преобразовывать:

df = pd.DataFrame(data, dtype='str')
df2 = pd.DataFrame(data2, dtype='str')
→ Ссылка
Автор решения: danilfg

В общем разобрался, нужно было вот так менять тип:

df['col2'].astype(str, copy=False)

И все стало нормальным.

→ Ссылка