2016-09-19 34 views
3

我試圖做兩個數據框之間的簡單合併。這些來自兩個不同的SQL表,其中加入鍵是字符串:熊貓 - 合併字符串列不工作(錯誤?)

>>> df1.col1.dtype 
dtype('O') 
>>> df2.col2.dtype 
dtype('O') 

我嘗試使用這個合併它們:

>>> merge_res = pd.merge(df1, df2, left_on='col1', right_on='col2') 

內連接的結果是空的,它首先促使我在十字路口可能沒有任何條目:

>>> merge_res.shape 
(0, 19) 

但是,當我嘗試匹配單個元素時,我看到了這個非常奇怪的行爲。

# 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爲整數,只是因爲它可以,即使它應該將同時匹配視爲字符串。

(我試圖複製這種使用樣本dataframes,但對於小例子,我沒有看到這種行爲。我如何能找到一個更具描述性的例子任何建議,將和感激。)

+1

它看起來像您已在列混合dtypes,我建議您首先嚐試強迫所有值數值所以'DF1 [」下一次嘗試'df1 ['col1'] = pd.to_numeric(df1 [ 'col1'],errors ='coerce')'這會強制duff值到'NaN',在那裏它可以 – EdChum

+0

啊,謝謝@EdChum!一些值可以轉換爲「int」,但其他值不能。因此,該列的正確的dtype應該是'str',但由於這不是一個合適的dtype,所以我認爲'object'會起作用。但是,當我手動將所有內容轉換爲'str'時,合併確實奏效。謝謝! – user1496984

+0

你能發表一個答案,然後在幾天內接受你自己的答案,所以這個問題並不是沒有答案,謝謝 – EdChum

回答

7

的問題是object dtype有誤導性。我認爲這意味着所有項目都是字符串。但顯然,在閱讀文件熊貓的同時,將一些元素轉換爲整數,並將餘數保留爲字符串。

的解決方案是確保每一個領域是一個字符串:

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

然後合併按預期工作。

(我希望能有指定的str一個dtype的一種方式......)

+0

奇怪。您的解決方案奏效但是在前後,變量的dtype是'O'。我想,就像你提到的那樣,這些對象類型還有更多內容。希望它更透明。 –