Problemet var att object
dtype är missvisande. Jag trodde att det betydde att alla föremål var strängar. Men tydligen konverterade pandas vissa element till ints när de läste filen och lämnade resten som strängar.
Lösningen var att se till att varje fält är en sträng:
>>> df1.col1 = df1.col1.astype(str)
>>> df2.col2 = df2.col2.astype(str)
Då fungerar sammanslagningen som förväntat.
(Jag önskar att det fanns ett sätt att ange en dtype
av str
...)