寻找熊猫中两个系列的交集

use*_*289 51 python series pandas

我在pandas/python中有两个系列s1和s2,并且想要计算交集,即系列的所有值都是常见的.

我如何使用concat函数执行此操作?我一直试图解决它,但一直无法(我不想计算s1和S2的索引上的交集,但是在值上).

提前致谢.

Joo*_*oop 60

将两个系列放在Python的set容器中,然后使用set intersection方法:

s1.intersection(s2)
Run Code Online (Sandbox Code Playgroud)

然后根据需要转换回列表.

刚注意到标签中的熊猫.可以翻译回来:

pd.Series(list(set(s1).intersection(set(s2))))
Run Code Online (Sandbox Code Playgroud)

从评论中我已将其更改为更Pythonic的表达式,该表达式更短且更易于阅读:

Series(list(set(s1) & set(s2)))
Run Code Online (Sandbox Code Playgroud)

除非索引数据对你很重要,否则应该这样做.

list(...)在转到pd之前添加了翻译集.系列因为pandas不接受set作为Series的直接输入.

  • 仅供参考,也可以这样做:``s1 [s1.isin(s2)]``,我的时间表示同样的性能 (8认同)
  • `set(s1)&set(s2)`:) (5认同)
  • 另外,你可以使用`&`运算符来设置交集. (2认同)
  • ``isin``保持与s1相同的顺序,并且在非常大的系列中速度更快 (2认同)

eld*_*d-a 34

建立:

s1 = pd.Series([4,5,6,20,42])
s2 = pd.Series([1,2,3,5,42])
Run Code Online (Sandbox Code Playgroud)

时序:

%%timeit
pd.Series(list(set(s1).intersection(set(s2))))
10000 loops, best of 3: 57.7 µs per loop

%%timeit
pd.Series(np.intersect1d(s1,s2))
1000 loops, best of 3: 659 µs per loop

%%timeit
pd.Series(np.intersect1d(s1.values,s2.values))
10000 loops, best of 3: 64.7 µs per loop
Run Code Online (Sandbox Code Playgroud)

因此,即使对于小型系列,numpy解决方案也可以与集合解决方案相媲美,如果使用values明确的话.

  • 最新的numpy(1.8.1)和pandas(0.14.1)的redid测试看起来像你的第二个例子现在可以与其他人交往.对于较大的数据,您的最后一种方法明显胜过其他方法3倍 (6认同)

jbn*_*jbn 13

如果您正在使用Pandas,我假设您也在使用NumPy.Numpy有一个intersect1d适用于Pandas系列的功能.

例:

pd.Series(np.intersect1d(pd.Series([1,2,3,5,42]), pd.Series([4,5,6,20,42])))
Run Code Online (Sandbox Code Playgroud)

将返回值为5和42的Series.

  • 仅供参考,这比设置慢了几个数量级。:( (2认同)

Gle*_*son 9

蟒蛇

s1 = pd.Series([4,5,6,20,42])
s2 = pd.Series([1,2,3,5,42])

s1[s1.isin(s2)]
Run Code Online (Sandbox Code Playgroud)

[R

s1  <- c(4,5,6,20,42)
s2 <- c(1,2,3,5,42)

s1[s1 %in% s2]
Run Code Online (Sandbox Code Playgroud)

编辑:不处理欺骗.

  • 它不会正确处理重复,至少R代码,不知道python.在R中有`intersect`函数,对于data.frame/data.table使用`fintersect`. (2认同)

kvb*_*kvb 7

pd.merge可以使用:

pd.merge(series1, series2, how='inner').drop_duplicates()
Run Code Online (Sandbox Code Playgroud)

请注意,结果是一个数据框。