熊猫内部合并/加入返回所有行

Posted

技术标签:

【中文标题】熊猫内部合并/加入返回所有行【英文标题】:Pandas inner merge/join returning all rows 【发布时间】:2018-01-10 07:21:24 【问题描述】:

我正在尝试根据两者中存在的列合并两个数据框,只保留两组的交集。

想要的结果是:

 foo           bar            foobar
x y z        x j i           x y z j i
a 1 2        a 9 0           a 1 2 9 0
b 3 4        b 9 0           b 3 4 9 0 
c 5 6        c 9 0           c 5 6 9 0
d 7 8        e 9 0           
             f 9 0 

我没有产生预期结果的代码是:

pd.merge(foo, bar, how='inner', on='x')

相反,代码似乎返回:

 foo           bar            foobar
x y z        x j i           x y z j i
a 1 2        a 9 0           a 1 2 9 0
b 3 4        b 9 0           b 3 4 9 0 
c 5 6        c 9 0           c 5 6 9 0
d 7 8        e 9 0           e * * 9 0
             f 9 0           f * * 9 0

(其中 * 表示 NaN)

我哪里错了?我已经到达第三个谷歌页面,试图解决这个问题,但没有任何效果。无论我做什么,我都会得到一个外连接,两个集合中的所有行。

【问题讨论】:

你的代码给出了什么结果? @MaxU 我不明白的是这段代码确实给出了正确的结果。 @MaxU 尽管它们代表相同的东西,但它们略有不同 - 一个是非空 int64,而另一个是 int64。会不会是这个问题? @cᴏʟᴅsᴘᴇᴇᴅ,我认为这是因为 x 列中的重复 @MaxU 你的意思是在 OP 的实际数据中? 【参考方案1】:

通常这意味着您在用于连接的列中有重复项,从而产生笛卡尔积。

演示:

In [35]: foo
Out[35]:
   x  y  z
0  a  1  2
1  b  3  4
2  c  5  6
3  d  7  8

In [36]: bar
Out[36]:
   x  j  i
0  a  9  0
1  b  9  0
2  a  9  0
3  a  9  0
4  b  9  0

In [37]: pd.merge(foo, bar)
Out[37]:
   x  y  z  j  i
0  a  1  2  9  0
1  a  1  2  9  0
2  a  1  2  9  0
3  b  3  4  9  0
4  b  3  4  9  0

【讨论】:

以上是关于熊猫内部合并/加入返回所有行的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫中按范围加入/合并的最佳方式

加入两个熊猫数据框

熊猫地图返回列表

合并数据框以保留所有项目熊猫

对分组的熊猫数据框中的行求和并返回 NaN

从熊猫数据框中的组内选择特定行