熊猫内部合并/加入返回所有行
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
【讨论】:
以上是关于熊猫内部合并/加入返回所有行的主要内容,如果未能解决你的问题,请参考以下文章