按另一个 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
我想要的输出(基本上是 s1
和 s2
的交集):
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)
结果
假设我有一个系列(或 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
问题是:我想创建一个由 城市 组成的系列,但只有这些城市具有 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)
结果