我在熊猫中有两个序列s1
和s2
,并希望计算交集,即该序列的所有值都相同的地方。
我将如何使用concat
功能执行此操作?我一直在尝试解决这个问题,但是却无法做到(我不想在s1
和s2
的索引上计算交集,但在值上进行计算)。
将两个系列都放置在Python的set container中,然后使用设置交集方法:
s1.intersection(s2)
然后根据需要转换回列表。
刚刚注意到标签中的熊猫。可以翻译成:
pd.Series(list(set(s1).intersection(set(s2))))
根据评论,我已将其更改为更具Pythonic的表达式,该表达式更短且更易于阅读:
Series(list(set(s1) & set(s2)))
应该成功,除非索引数据对您也很重要。
已添加list(...)
以在转至pd.Series之前转换集,因为熊猫不接受集作为系列的直接输入。
设置:
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解也可以与设置解相提并论。
如果您使用的是熊猫,我想您也在使用NumPy。 Numpy具有功能intersect1d
,可与熊猫系列配合使用。
示例:
pd.Series(np.intersect1d(pd.Series([1,2,3,5,42]), pd.Series([4,5,6,20,42])))
将返回一个值为5和42的序列。
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]
编辑:不处理欺骗。
可以像下面那样使用合并运算符
pd.merge(df1, df2, how='inner')