我正在尝试创建一个Pandas交叉表,但是我想运行一个连接,但由于我认为这是一种特殊的DataFrame类型,所以它不允许我这样做。参见下面的示例。
df = pd.DataFrame({'A': ["Alice", "Alice", "Alice", "Bob","Bob","Bob","Charlie"], 'B': ["X","X","Y","X","Y","Z","Z"]})
z = pd.crosstab(df['A'],df['B'])
z.index.name="ID"
z.reset_index(inplace=True)
zz = pd.DataFrame({"ID":["Alice","Daniel","Bob","Charlie"})
zz.join(z,on="DT_ID")
然后我收到以下错误消息:
ValueError: You are trying to merge on object and int64 columns. If you wish to proceed you should use pd.concat
但是,如果我检查dtype,它们是两个ID列中的对象。我在这里想念什么吗?
[join
代表index
,您正在寻找merge
df=zz.merge(z.reset_index(),on="ID")
您可以使用合并。
#inner join
pd.merge(z,zz,on='ID')
ID X Y Z
0 Alice 2 1 0
1 Bob 1 1 1
2 Charlie 0 0 1
#right join
pd.merge(z,zz,on='ID',how='right')
ID X Y Z
0 Alice 2.0 1.0 0.0
1 Bob 1.0 1.0 1.0
2 Charlie 0.0 0.0 1.0
3 Daniel NaN NaN NaN
它可能发生在两种情况1。使用join方法:您可能是在标签而不是索引上连接DataFrames2。使用合并方法:您可能正在将两个不同类型的列上的DataFrames连接起来。
您正在尝试使用连接方法在标签上而不在索引上进行连接
data_x.join(data_y, on='key')
在第一种情况下,您可以编辑代码以加入索引。在下面的代码中,我在要连接的列上设置了索引。
data_x.set_index('key').join(data_y.set_index('key'))
但是更简单的方法是将合并方法替换为合并方法。
data_x.merge(data_y)
您正在使用合并方法在不同类型的列上进行连接
data_x.merge(data_y, on='key')
在第二种情况下,您可以简单地更改其中一列的列类型-或同时更改两者。一种方便的方法是通过astype方法。
data_x.key.astype(int)
data_y.key.astype(int)
data_x.merge(data_y, on='key')