Поиск пересечения между двумя сериями в Pandas
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: не обрабатывает дураков.