【问题标题】:Python Pandas Dataframe search text in the cellsPython Pandas Dataframe 在单元格中搜索文本
【发布时间】:2020-02-13 06:46:34
【问题描述】:

这是我在 stackoverflow 上的第一篇文章:) 我已经开始学习 python 和 pandas 库。我在单元格数据框中查找文本时遇到问题。

程序:

导入一个两个文件的csv(这里没问题):

1数据框:

Column1  | Column2
546852   | Lorem ipsum dolor sit amet
248597   | Amet luctus venenatis lectus magna fringilla.
842457   |  Neque egestas congue quisque egestas.
8465     | Amet luctus venenatis lectus
648      |  Neque egestas congue 
55       | Lorem ipsum dolor 

2数据帧:

DATA 
Lorem 
Lectus 
Congue
etc.

我的问题:如何在 1Dataframe.columna2 中从 2dataframe(Lorem、Lectus、Congue 等)中找到单词并生成具有 3 列的数据框:

Column1  | Column2                                                | Column3 
546852   | **Lorem** ipsum dolor sit amet                         | Lorem 
248597   | Amet **luctus** venenatis lectus magna fringilla.      | Lectus 
842457   |  Neque egestas **congue** quisque egestas.             | Congue 
8465     | Amet **luctus** venenatis lectus                       | Lectus 
648      |  Neque egestascongue  **congue**                       | Congue  
55       | **Lorem** ipsum dolor                                  | Lorem

我在 Google 上进行了搜索,但没有找到任何解决方案。终于敢在stackoverflow上发帖了:)

【问题讨论】:

  • 如果出现多个单词怎么办?还有这个词周围的**是什么?
  • 旁注:反过来,你的第一个数据帧是 2d,你的第二个是 1d

标签: python pandas dataframe search


【解决方案1】:

这种方式:


def find_elements(row):
    for element in df2.Data.unique():
        if row.Column2.str.contains(element):
            return element

df3 = df1.copy()
df3["Column3"] = df3.apply(find_elements, axis=1)

这应该可行,当然,您可以找到其他方法。

编辑:正如@vb_rises 所述,如果多个单词在同一个句子中,该函数将只返回第一个匹配项。

【讨论】:

  • 这不适用于您将小写字母与大写单词进行比较。
【解决方案2】:

如果您想获取所有可能的事件,您可以使用以下函数。请记住,您也应该处理小写。

lst = [l.lower() for l in df2["DATA"].unique().to_list()]

def fun(x):
    x = x["Column2"].lower()
    return [l.capitalize() for l in lst if l in x]

df1["Column3"] = df1.apply(fun, axis=1)

【讨论】:

    【解决方案3】:

    使用Series.apply + lambda 函数 和列表理解,以应对每个单元格不止一个单词的情况:

    df1['Column3']=df1['Column2'].apply(lambda x: [word  for word in df2['DATA'] if word.upper() in x.upper()])
    print(df1)
    

       Column1                                        Column2   Column3
    0   546852                     Lorem,ipsum,dolor,sit,amet   [Lorem]
    1   248597  Amet,luctus,venenatis,lectus,magna,fringilla.  [Lectus]
    2   842457          Neque,egestas,congue,quisque,egestas.  [Congue]
    3     8465                   Amet,luctus,venenatis,lectus  [Lectus]
    4      648                           Neque,egestas,congue  [Congue]
    5       55                              Lorem,ipsum,dolor   [Lorem]
    

    【讨论】:

    • 嗨@ansev 与其他答案的实际区别是什么?
    • series.unique() 不是必需的,除非有重复的单词并且您不想重复计算它们。另一方面,我认为这种语法更简洁
    猜你喜欢
    • 2021-07-25
    • 2016-05-12
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 2020-10-13
    • 2017-11-01
    • 2022-01-01
    • 2016-11-30
    相关资源
    最近更新 更多