【问题标题】:Filter Series/DataFrame by another DataFrame通过另一个 DataFrame 过滤 Series/DataFrame
【发布时间】:2020-05-08 12:12:09
【问题描述】:

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

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

我的问题是:如何以一种简洁的方式做到这一点?

【问题讨论】:

  • @AlexandreB。当然。已编辑。
  • 你说你想要的输出是s1s2的交集,但是Fairbanks不在s2中?
  • @thesecond,看看我的回答,如果您需要更多帮助,请告诉我

标签: python pandas dataframe series


【解决方案1】:

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

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

【讨论】:

  • 完美运行!谢谢!
【解决方案2】:

使用的数据

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'] 以从迭代器返回下一项。

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

结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-28
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    相关资源
    最近更新 更多