Поиск пересечения между двумя сериями в Pandas

У меня есть две серии s1 и s2 в pandas/python и хочу вычислить пересечение, т. е. где все значения серии являются общими.

Как бы я использовал функцию concat для этого? Я пытался это выяснить, но не смог (я не хочу вычислять пересечение по индексам s1 и S2, но по значениям).

спасибо заранее.

5 ответов


Поместите обе серии в Python установить контейнер затем используйте метод пересечения set:

s1.intersection(s2)

а затем при необходимости преобразовать обратно в список.

только что заметил панд в теге. Может перевести обратно:

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

из замечаний я изменил его на более подходящие для Python выражения, которые короче и легче читать:

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

должен сделать трюк, за исключением того, если данные индекса также важны для вы.

добавил list(...) перевести набор перед переходом в pd.Серия как панды не принимает набор в качестве прямого ввода для серии.


настройка:

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 может быть сопоставимо с решением set даже для небольших серий, если используется values явно.


Если вы используете Panda, Я предполагаю, что вы также используете 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]

Edit: не обрабатывает дураков.


может использовать оператор merge следующим образом

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