如何在熊猫交叉表上运行联接

问题描述 投票:0回答:3

我正在尝试创建一个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列中的对象。我在这里想念什么吗?

python pandas dataframe crosstab
3个回答
0
投票

[join代表index,您正在寻找merge

df=zz.merge(z.reset_index(),on="ID")

0
投票

您可以使用合并。

#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

0
投票

它可能发生在两种情况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')
© www.soinside.com 2019 - 2024. All rights reserved.