当前位置: 首页 > 面试题库 >

如何在字符串包含上合并pandas?

司空俊雄
2023-03-14
问题内容

我有2个数据框,我想将它们合并到一个公共列上。但是,我要合并的列不是同一字符串,而是另一个中包含一个字符串,如下所示:

import pandas as pd
df1 = pd.DataFrame({'column_a':['John','Michael','Dan','George', 'Adam'], 'column_common':['code','other','ome','no match','word']})

df2 = pd.DataFrame({'column_b':['Smith','Cohen','Moore','K', 'Faber'], 'column_common':['some string','other string','some code','this code','word']})

我想要的结果d1.merge(d2, ...)如下:

column_a  |  column_b
----------------------
John      |  Moore    <- merged on 'code' contained in 'some code' 
Michael   |  Cohen    <- merged on 'other' contained in 'other string'  
Dan       |  Smith    <- merged on 'ome' contained in 'some string'  
George    |  n/a
Adam      |  Faber    <- merged on 'word' contained in 'word'

问题答案:

新答案

这是一种基于pandas / numpy的方法。

rhs = (df1.column_common
          .apply(lambda x: df2[df2.column_common.str.find(x).ge(0)]['column_b'])
          .bfill(axis=1)
          .iloc[:, 0])

(pd.concat([df1.column_a, rhs], axis=1, ignore_index=True)
 .rename(columns={0: 'column_a', 1: 'column_b'}))

  column_a column_b
0     John    Moore
1  Michael    Cohen
2      Dan    Smith
3   George      NaN
4     Adam    Faber

旧答案

这是左联接行为的一种解决方案,因为它不会保留column_a不匹配任何column_b值的值。这比上面的numpy /
pandas解决方案要慢,因为它使用两个嵌套iterrows循环来构建python列表。

tups = [(a1, a2) for i, (a1, b1) in df1.iterrows() 
                 for j, (a2, b2) in df2.iterrows()
        if b1 in b2]

(pd.DataFrame(tups, columns=['column_a', 'column_b'])
   .drop_duplicates('column_a')
   .reset_index(drop=True))

  column_a column_b
0     John    Moore
1  Michael    Cohen
2      Dan    Smith
3     Adam    Faber


 类似资料:
  • 问题内容: 我想检查我的字符串是否包含+字符。我尝试了以下代码 但是它没有给出预期的结果。 问题答案: 您需要此: 类的方法不使用正则表达式作为参数,而是使用普通文本。 编辑: 输出:

  • 问题内容: 通常我希望有一种方法,但是似乎没有。 有什么合理的方法来检查? 问题答案: ECMAScript 6引入了: 但是不支持。在ECMAScript 5或更旧的环境中,使用,当找不到子字符串时,它将返回-1:

  • 通常我希望有方法,但似乎没有。 对此有什么合理的检查方法?

  • 问题内容: 我想用多个定界符分割一个字符串,但将定界符保留在结果列表中。我认为这是解析任何一种公式的初始步骤都是有用的,而且我怀疑有一个不错的Python解决方案。 有人在这里用Java问了类似的问题。 例如,典型的拆分如下所示: 但是我正在寻找一种添加加号(或保留它)的好方法: 最终,我想对每个运算符和括号进行此操作,因此,如果有一种方法 一劳永逸,那就更好了。 问题答案: 您可以使用Pytho

  • 我有一个字符串返回给我,其中包含转义字符。 这是一个示例字符串 " test\40gmail.com " 如您所见,它包含转义字符。我需要将其转换为其实际值,即 " test@gmail.com " 我该怎么做?

  • 问题内容: 我有以下Angular代码: 如何使用ng-if条件查找特定字符: 只在字符在这里时显示代码?我的值是88?77,数字是动态的,但问号始终存在,我似乎无法基于此进行过滤? 问题答案: ES2015更新 ES2015具有检查字符串是否包含另一个字符串的方法。如果目标环境支持,则可以使用它。如果在 干草堆中 找到了 针, 则该方法返回,否则返回。 __ 在这里是要搜索的字符串。 请参阅MD