Фильтр серии / DataFrame другим DataFrame - PullRequest
2 голосов
/ 08 мая 2020

Предположим, у меня есть серия (или DataFrame) s1, например, список всех университетов и колледжей в США:

                     University
0            Searcy Harding University
1          Angwin Pacific Union College
2    Fairbanks University of Alaska Fairbanks
3        Ann Arbor University of Michigan

И еще одна серия (od DataFrame) s2, для примерный список всех городов в США:

      City
0    Searcy
1    Angwin 
2   New York 
3   Ann Arbor 

И желаемый результат (в основном пересечение s1 и s2):

     Uni City
0     Searcy
1     Angwin 
2    Fairbanks 
3    Ann Arbor 

Дело в том, что я Я хочу создать серию, состоящую из городов , но только тех, в которых есть университет / колледж. Первой моей мыслью было удалить части «Университет» или «Колледж» из s1, но оказалось, что этого недостаточно, как в случае Angwin Pacific Union College. Затем я подумал о том, чтобы оставить только первое слово, но исключает Ann Arbor. Наконец, я получил серию всех городов s2, и теперь я пытаюсь использовать его в качестве фильтра (что-то похожее на .contains() или .isin()), поэтому, если строка s1 (имя Uni) содержит любое из элементов s2 (название города), затем вернуть только название города.

У меня вопрос: как это аккуратно сделать?

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Используемые данные

s=pd.DataFrame({'University':['Searcy Harding University','Angwin Pacific Union College','Fairbanks University of Alaska Fairbanks','Ann Arbor University of Michigan']})


s2=pd.DataFrame({'City':['Searcy','Angwin','Fairbanks','Ann Arbor']})

Преобразовать s2.City для создания итератора

st=set(s2.City.unique().tolist())

Вычислить s['Uni City'] с помощью функции next () для возврата следующего элемента из итератор.

s['Uni City']=s['University'].apply(lambda x: next((i for i in st if i in x)), np.nan)

Результат

enter image description here

1 голос
/ 08 мая 2020

Я бы попытался составить список городов, которые содержатся хотя бы в одном названии университета:

pd.Series([i for i in s2 if s1.str.contains(i).any()], name='Uni City')

С данными вашего примера это дает:

0       Searcy
1       Angwin
2    Ann Arbor
Name: Uni City, dtype: object
...