2016-09-19 38 views
3

私は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をできるだけ整数に変換すると考えていますが、と一致する必要があります。

(私はこの使用したサンプルデータフレームを複製しようとしましたが、小さな例については、私は、この動作が表示されていない。私はより多くの記述例を見つけることができる方法上の任意の提案が同様にいただければ幸いです。)

+1

、私は最初の「DF1の[ 'ので、数値にすべての値を強制しようとしていることをお勧めこれは失敗する可能性があります。つまり、intとして表現できないstr値があることを意味します。次に、 'df1 ['col1'] = pd.to_numeric(df1 [])= df1 ['col1' 'col1']、errors = 'coerce') 'これはダフの値を' NaN'に強制します – EdChum

+0

ああ、ありがとう@EdChum!値の中には 'int'に変換できるものもあれば、できないものもあります。したがって、その列の適切なdtypeは 'str'であるべきですが、それは適切なdtypeではないので、' object'が動作すると思いました。しかし、手動ですべてを 'str'に変換すると、マージがうまくいきました。ありがとう! – user1496984

+0

あなたは答えを投稿し、数日後に自分の答えを受け入れることができるので、この質問には答えが残っていないので、ありがとう – EdChum

答えて

7

問題は、object dtypeが誤解を招くということでした。私はすべての項目が文字列であることを意味すると思った。しかし、明らかに、ファイルを読んでいる間、パンダはいくつかの要素をintに変換し、残りを文字列として残していました。

>>> df1.col1 = df1.col1.astype(str) 
>>> df2.col2 = df2.col2.astype(str) 

予想通りその後のマージが動作します。

ソリューションは、すべてのフィールドが文字列であることを確認しました。あなたの列にdtypesを混入しているように見える

(私はstrdtypeを指定する方法があったことを望む...)

+0

奇妙な。ソリューションが機能しました。しかし、前と後の両方で、問題の変数のdtypeは 'O'です。私が推測しているように、これらのオブジェクトタイプのフードの下には多くのものがあります。それがより透明であったことを願います。 –

関連する問題