2016-09-19 38 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'。我想,就像你提到的那样,这些对象类型还有更多内容。希望它更透明。 –