python 2 vs python 3 pd.merge命令

时间:2018-10-18 08:31:55

标签: python python-3.x pandas

如果我运行python 2,以下命令可以正常工作

df5b = pd.merge(df5a, df5bb, how='outer')

但是,当我在python 3中使用相同的dfs运行相同的命令时,出现以下错误:

ValueError: You are trying to merge on object and int64 columns. If you wish to proceed you should use pd.concat

我的数据框非常大,我希望有人能在不提供我的数据框示例的情况下帮助我。该命令在python 2上还可以,因此我认为问题不在于数据帧,而可能是在python 3中对此命令进行了更改吗?

2 个答案:

答案 0 :(得分:2)

有些列在一个DataFrame中是整数,而在另一个具有相同名称的字符串中则存在问题。

最简单的解决方案是将所有列都转换为字符串:

df5b = pd.merge(df5a.astype(str), df5bb.astype(str), how='outer')

另一个是测试dtypes:

print (df5a.dtypes)
print (df5bb.dtypes)

并转换相同的列,例如将字符串列从列表转换为整数:

cols = ['col1','col12','col3']
df5a[cols] = df5a[cols].astype(int)

示例

df5a = pd.DataFrame({
         'B':[4,5,4,5],
         'C':[7,8,9,4],
         'F':list('aaab')
})

df5bb = pd.DataFrame({
         'B':['4','5','5'],
         'F':list('aab')
})

df5b = pd.merge(df5a.astype(str), df5bb.astype(str), how='outer')
print (df5b)

   B  C  F
0  4  7  a
1  4  9  a
2  5  8  a
3  5  4  b

print (df5a.dtypes)
B     int64
C     int64
F    object
dtype: object

print (df5bb.dtypes)
B    object
F    object
dtype: object

cols = ['B']
df5bb[cols] = df5bb[cols].astype(int)

df5b = pd.merge(df5a, df5bb, how='outer')
print (df5b)

   B  C  F
0  4  7  a
1  4  9  a
2  5  8  a
3  5  4  b

答案 1 :(得分:0)

正如我在评论部分中所述,混合类型(可能是intstrfloat上不会发生强制转换,因此您可以考虑concat或将其转换为str,然后合并jezrael提到的内容。

只需确定您可以看到的类型即可。

>>> pd.concat([df5a, df5bb]).dtypes
B     object
C    float64
F     object
dtype: object

>>> pd.concat([df5a, df5bb])
   B    C  F
0  4  7.0  a
1  5  8.0  a
2  4  9.0  a
3  5  4.0  b
0  4  NaN  a
1  5  NaN  a
2  5  NaN  b