我试图做两个数据框之间的简单合并。这些来自两个不同的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,但对于小例子,我没有看到这种行为。我如何能找到一个更具描述性的例子任何建议,将和感激。)
它看起来像您已在列混合dtypes,我建议您首先尝试强迫所有值数值所以'DF1 [”下一次尝试'df1 ['col1'] = pd.to_numeric(df1 [ 'col1'],errors ='coerce')'这会强制duff值到'NaN',在那里它可以 – EdChum
啊,谢谢@EdChum!一些值可以转换为“int”,但其他值不能。因此,该列的正确的dtype应该是'str',但由于这不是一个合适的dtype,所以我认为'object'会起作用。但是,当我手动将所有内容转换为'str'时,合并确实奏效。谢谢! – user1496984
你能发表一个答案,然后在几天内接受你自己的答案,所以这个问题并不是没有答案,谢谢 – EdChum