私は2つのデータフレームの間で簡単なマージをしようとしています。pandas - 文字列のマージがうまくいかない(バグ?)
>>> df1.col1.dtype
dtype('O')
>>> df2.col2.dtype
dtype('O')
私はこの使用してそれらをマージしよう:内部結合の結果が空の
>>> merge_res = pd.merge(df1, df2, left_on='col1', right_on='col2')
を、最初に私を促したこれらは、加入キーは文字列である二つの異なるSQLテーブルから来ます
>>> merge_res.shape
(0, 19)
しかし、1つの要素に一致させようとすると、これは本当に奇妙な動作です。
# Pick random element in second dataframe
>>> df2.iloc[5,:].col2
'95498208100000'
# Manually look for it in the first dataframe
>>> df1[df1.col1 == '95498208100000']
0 rows × 19 columns
# Empty, which makes sense given the above merge result
# Now look for the same value as an integer
>>> df1[df1.col1 == 95498208100000]
1 rows × 19 columns
# FINDS THE ELEMENT!?!
したがって、列は 'object' dtypeで定義されます。それらを文字列として検索しても結果は得られません。それらを整数として検索すると結果が返されますが、これがマージが上で動作しない理由です。
何が起こっているのですか?
パンダはdf1.col1
をできるだけ整数に変換すると考えていますが、はと一致する必要があります。
(私はこの使用したサンプルデータフレームを複製しようとしましたが、小さな例については、私は、この動作が表示されていない。私はより多くの記述例を見つけることができる方法上の任意の提案が同様にいただければ幸いです。)
、私は最初の「DF1の[ 'ので、数値にすべての値を強制しようとしていることをお勧めこれは失敗する可能性があります。つまり、intとして表現できないstr値があることを意味します。次に、 'df1 ['col1'] = pd.to_numeric(df1 [])= df1 ['col1' 'col1']、errors = 'coerce') 'これはダフの値を' NaN'に強制します – EdChum
ああ、ありがとう@EdChum!値の中には 'int'に変換できるものもあれば、できないものもあります。したがって、その列の適切なdtypeは 'str'であるべきですが、それは適切なdtypeではないので、' object'が動作すると思いました。しかし、手動ですべてを 'str'に変換すると、マージがうまくいきました。ありがとう! – user1496984
あなたは答えを投稿し、数日後に自分の答えを受け入れることができるので、この質問には答えが残っていないので、ありがとう – EdChum