在熊猫中查找两个序列之间的交点

问题描述 投票:55回答:5

我在熊猫中有两个序列s1s2,并希望计算交集,即该序列的所有值都相同的地方。

我将如何使用concat功能执行此操作?我一直在尝试解决这个问题,但是却无法做到(我不想在s1s2的索引上计算交集,但在值上进行计算)。

python pandas series intersection
5个回答
66
投票

将两个系列都放置在Python的set container中,然后使用设置交集方法:

s1.intersection(s2)

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

刚刚注意到标签中的熊猫。可以翻译成:

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

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

Series(list(set(s1) & set(s2)))

应该成功,除非索引数据对您也很重要。

已添加list(...)以在转至pd.Series之前转换集,因为熊猫不接受集作为系列的直接输入。


39
投票

设置:

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

因此,即使对于小数列,如果明确使用values,numpy解也可以与设置解相提并论。


14
投票

如果您使用的是熊猫,我想您也在使用NumPy。 Numpy具有功能intersect1d,可与熊猫系列配合使用。

示例:

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

将返回一个值为5和42的序列。


10
投票

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]

编辑:不处理欺骗。


3
投票

可以像下面那样使用合并运算符

pd.merge(df1, df2, how='inner')
© www.soinside.com 2019 - 2024. All rights reserved.