O problema era que o
object
dtype é enganoso. Eu pensei que significava que todos os itens eram strings. Mas aparentemente, ao ler o arquivo pandas estava convertendo alguns elementos em ints e deixando os restos como strings. A solução foi garantir que cada campo seja uma string:
>>> df1.col1 = df1.col1.astype(str)
>>> df2.col2 = df2.col2.astype(str)
Em seguida, a mesclagem funciona conforme o esperado.
(Gostaria que houvesse uma maneira de especificar um
dtype
de str
...)