Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Поместите обе строки в контейнер набора python. См. Документацию: http://docs.python.org/2/library/sets.html

то используйте метод set intersection.

s1.intersection(s2), а затем при необходимости преобразовать обратно в список.

Просто заметил pandas в теге. Можно перевести на это.

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

Из комментариев я изменил это на более питоновское выражение, которое короче и легче читать:

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

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

Добавили список (....) для перевода набора перед переходом на pd.Series pandas не принимает набор как прямой ввод для серии.

Ответ 2

Настройка:

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.

Ответ 3

Если вы используете Panda, я предполагаю, что вы также используете NumPy. У Numpy есть функция intersect1d, которая будет работать с серией Pandas.

Пример:

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

вернет серию со значениями 5 и 42.

Ответ 4

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]

Изменить: Не обрабатывает обман.

Ответ 5

Можно использовать оператор слияния, как следует

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