按另一个 DataFrame 筛选 Series/DataFrame

Filter Series/DataFrame by another DataFrame

假设我有一个系列(或 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 

我想要的输出(基本上是 s1s2 的交集):

     Uni City
0     Searcy
1     Angwin 
2    Fairbanks 
3    Ann Arbor 

问题是:我想创建一个由 城市 组成的系列,但只有这些城市具有 university/college。我的第一个想法是从 s1 中删除 "University" 或 "College" 部分,但事实证明这是不够的,就像 Angwin Pacific Union College 的情况一样。然后我想到只留下第一个字,但是那不包括Ann Arbor。 最后,我得到了一系列所有城市 s2,现在我正尝试将其用作过滤器(类似于 .contains().isin()),所以如果一个字符串 s1(统一名称)包含s2(城市名称)的任意个元素,那么return只有城市名称。

我的问题是:如何巧妙地做到这一点?

我会尝试建立一个包含至少一个大学名称的城市的列表理解:

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

使用的数据

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())

使用 next() 函数计算 s['Uni City'] 以 return 迭代器中的下一个项目。

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

结果