假设我有一个Series(或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
事情是:我想创建一个由cities组成的系列,但只有这些,它们具有大学/学院。我的第一个想法是从s1
中删除“大学”或“学院”部分,但事实证明,这与Angwin Pacific Union College
一样还不够。然后,我想到只留下第一个单词,但不包括Ann Arbor
。最终,我得到了所有城市的序列s2
,现在我正尝试将其用作过滤器(类似于.contains()
或.isin()
的过滤器),因此,如果字符串s1
(通用名称)包含s2
(城市名称)的元素的any,然后仅返回城市名称。
我的问题是:如何以一种整洁的方式来做?
我将尝试对至少一个大学名称中包含的城市进行列表理解:
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
使用的数据
df=pd.DataFrame({'University':['Searcy Harding University','Angwin Pacific Union College','Fairbanks University of Alaska Fairbanks','Ann Arbor University of Michigan']})
df
df2=df=pd.DataFrame({'City':['Searcy','Angwin','Fairbanks','Ann Arbor']})
df2
将df2.City
转换为设置
s=set(df2.City.unique().tolist())
计算df['Uni City']
df['Uni City']=df['University'].apply(lambda x: next((i for i in s if i in x)), np.nan)
结果