問題は、object dtypeは誤解を招く恐れがあります。すべてのアイテムがストリングスだと思いました。しかし、どうやら、ファイルを読んでいる間、パンダはいくつかの要素をintに変換し、残りを文字列として残していました。
解決策は、すべてのフィールドが文字列であることを確認することでした:
>>> df1.col1 = df1.col1.astype(str)
>>> df2.col2 = df2.col2.astype(str)
その後、マージは期待どおりに機能します。
(dtypeを指定する方法があればいいのにと思います strの ...)