我在pandas / python中有两个系列s1和s2,想要计算交集,即系列的所有值都是常见的。
我如何使用concat函数执行此操作?我一直试图解决它,但一直无法(我不想计算s1和S2的索引上的交集,但是在值上)。
提前致谢。
答案 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保持完整