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 шт):
Естественно, изменённые данные нужно записать обратно в колонку, вы же результат никуда не записываете:
df['col2'] = df['col2'].astype('str')
P.S. Я убрал copy=False, не могу точно сказать, почему у вас с ним не работает без присваивания, но использование этого параметра в документации сопровождается предупреждением и лучше с ним не экспериментировать. Вообще, операции через точку в Pandas часто работают на копии данных, поэтому лучше все присвоения делать в явном виде, не используя изменения "на месте" (inplace).
Другой вариант - указать сразу тип данных в явном виде, чтобы потом не преобразовывать:
df = pd.DataFrame(data, dtype='str')
df2 = pd.DataFrame(data2, dtype='str')
В общем разобрался, нужно было вот так менять тип:
df['col2'].astype(str, copy=False)
И все стало нормальным.