【问题标题】: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 的实际数据中?

标签: python pandas merge inner-join


【解决方案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

【讨论】:

    猜你喜欢
    • 2018-03-27
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多