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

时间:2013-08-06 11:58:31

标签: python pandas series

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

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

提前致谢。

6 个答案:

答案 0 :(得分:51)

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

s1.intersection(s2)

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

注意标签中的大熊猫。可以翻译回来:

pd.Series(list(set(s1).intersection(set(s2))))

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

Series(list(set(s1) & set(s2)))
除非索引数据对你很重要,否则

应该可以解决问题。

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

答案 1 :(得分:25)

设定:

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

时序:

%%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

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

答案 2 :(得分:11)

如果您正在使用Pandas,我假设您也在使用NumPy。 Numpy有一个函数intersect1d,它将与Pandas系列一起使用。

示例:

pd.Series(np.intersect1d(pd.Series([1,2,3,5,42]), pd.Series([4,5,6,20,42])))

将返回值为5和42的Series。

答案 3 :(得分:7)

的Python

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

s1[s1.isin(s2)]

[R

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

s1[s1 %in% s2]

修改:不处理欺骗行为。

答案 4 :(得分:2)

可以使用合并运算符,如下所示

pd.merge(df1, df2, how='inner')

答案 5 :(得分:0)

这是通过检查左右夹杂物的另一种解决方案

import pandas as pd

def intersect(left, right):
    left, right = pd.Series(pd.unique(left)), pd.Series(pd.unique(right))
    right = right.loc[right.isin(left)]
    left  =  left.loc[left.isin(right)]
    return pd.Series(pd.unique(left))

left = pd.Series([1,2,pd.NA, pd.NA, pd.NA], index=[*"abcde"], dtype="Int32")
right = pd.Series([pd.NA, pd.NA, 1, 3], index=[*"efgh"], dtype="Int32")
intersect(left, right)

这有2个主要优点:

  • 它与pandas Int32和其他可为空的数据类型一起使用。如果您的列包含pd.NA,则np.intersect1d会引发错误!

  • 它使熊猫dtype保持完整