【发布时间】:2017-01-27 17:20:26
【问题描述】:
我正在尝试在两个数据框之间进行简单的合并。它们来自两个不同的 SQL 表,其中连接键是字符串:
>>> df1.col1.dtype
dtype('O')
>>> df2.col2.dtype
dtype('O')
我尝试使用以下方法合并它们:
>>> merge_res = pd.merge(df1, df2, left_on='col1', right_on='col2')
inner join的结果是空的,首先提示我交集可能没有任何条目:
>>> 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!?!
因此,列是使用“对象”dtype 定义的。将它们作为字符串搜索不会产生任何结果。将它们作为整数搜索确实会返回结果,我认为这就是合并在上面不起作用的原因..
有什么想法吗?
这几乎就像认为 Pandas 将 df1.col1 转换为整数只是因为它可以,即使它应该在匹配时被视为字符串。
(我尝试使用示例数据框复制此内容,但对于小示例,我没有看到这种行为。任何关于如何找到更具描述性示例的建议也将不胜感激。)
【问题讨论】:
-
看起来你的列中混合了 dtypes,我建议首先尝试将所有值强制为数字所以
df1['col1'] = df1['col1'].astype(int)这可能会失败,这意味着你有一些 str 值不能表示为 int,所以接下来尝试df1['col1'] = pd.to_numeric(df1['col1'], errors='coerce'),它将强制将 duff 值设置为NaN,它可以 -
啊,谢谢@EdChum!一些值可以转换为
int,但其他值不能。因此,该列的正确 dtype 应该是str,但由于这不是正确的 dtype,我认为object会起作用。但是当我手动将所有内容转换为str时,合并确实有效。谢谢! -
你能否发布一个答案,然后在几天后接受你自己的答案,这样这个问题就不会没有答案了,谢谢