【问题标题】:Search in a dataframe using a list of terms and add a new column with the term/s founded使用术语列表在数据框中搜索并添加一个新列,其中包含已创建的术语
【发布时间】:2019-09-01 18:35:04
【问题描述】:

我有一个大数据框和一个这样的术语列表:

ID          COUNTRY     TEXT
123432      FR          En un lugar de la Mancha, de cuyo nombre no quiero 
123321      DE          No ha mucho tiempo que vivía un hidalgo de los de lanza en astillero
324221      UK          Tenía en su casa una ama que pasaba de los cuarenta, y una sobrina que no llegaba a los veinte
343212      IT          Frisaba la edad de nuestro hidalgo con los cincuenta años
431234      ES          Es, pues, de saber que este sobredicho hidalgo, los ratos que estaba ocioso -que eran los más del año-, se daba a leer libros de caballerías
123213      AU          Pero esto importa poco a nuestro cuento: basta que en la narración dél no se salga un punto de la verdad.
list_of_terms = ['hidalgo', 'años', 'Mancha' ]

list_of_terms 相当大,所以我需要一个循环来访问列表中的所有字符串。

我想要获得的是一个新的数据框,其中的行包含术语列表和一个名为 KEYWORDS 的新列,其中关键字/关键字位于 TEXT 列内。

生成的数据框将是:

ID          COUNTRY    KEYWORDS           TEXT
123432      FR         'Mancha'           En un lugar de la Mancha, de cuyo nombre no quiero 
123321      DE         'hidalgo'          No ha mucho tiempo que vivía un hidalgo de los de lanza en astillero
343212      IT         'hidalgo','años'   Frisaba la edad de nuestro hidalgo con los cincuenta años
431234      ES         'hidalgo'          Es, pues, de saber que este sobredicho hidalgo, los ratos que estaba ocioso -que eran los más del año-, se daba a leer libros de caballerías

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    将您的数据框视为熊猫数据框:

    import numpy as np
    import pandas as pd
    import re
    df = pd.DataFrame({'ID':['123432','123321','324221','343212','431234','123213'],
                       'COUNTRY': ['FR', 'DE', 'UK', 'IT', 'ES', 'AU'],
                       'TEXT':['En un lugar de la Mancha, de cuyo nombre no quiero ', 'No ha mucho tiempo que vivía un hidalgo de los de lanza en astillero','Tenía en su casa una ama que pasaba de los cuarenta, y una sobrina que no llegaba a los veinte', 'Frisaba la edad de nuestro hidalgo con los cincuenta años', 'Es, pues, de saber que este sobredicho hidalgo, los ratos que estaba ocioso -que eran los más del año-, se daba a leer libros de caballerías','']})
    
    df['KEYWORDS'] = df.apply(lambda row: [el for el in list_of_terms if re.findall("\\b{}\\b".format(el),row.TEXT] , axis=1)
    df['KEYWORDS']= df.KEYWORDS.apply(lambda row : np.nan if len(row)==0 else row)
    df.dropna(subset=['KEYWORDS'], inplace=True)
    

    【讨论】:

    • 效果很好,但我需要完全匹配。例如,单词“cumpleaños”包括术语“años”。在您的代码中,这有效,但这不是我想要的。我只需要在单词 años 出现时没有前缀或后缀时找到匹配项。
    • @Marc 编辑了解决方案,如果您遇到任何问题,请告诉我。在这里,我对 if 条件使用了正则表达式。
    • 虽然看起来正则表达式是解决方案,但它还不起作用。现在的错误如下:error: ('unterminated character set at position 2', 'occurred at index 0')查看我的关键字,其中一些具有特殊字符,例如'[]','; ' 或 '
    • 你能把TEXT的准确输入和你正在测试的东西放在一起吗?这可能会有所帮助。
    【解决方案2】:

    这是使用str.extractallGroupBy.aggjoin 聚合的一种方法:

    r = r'({})'.format('|'.join(list_of_terms))
    # '(hidalgo|años|Mancha)'
    df['KEYWORDS'] = (df.TEXT.str.extractall(r)
                             .groupby(level=0)
                             .agg(', '.join))
    df[df.KEYWORDS.notna()]
    
    ID COUNTRY                                               TEXT  \
    0  123432      FR  En un lugar de la Mancha, de cuyo nombre no qu...   
    1  123321      DE  No ha mucho tiempo que vivía un hidalgo de los...   
    3  343212      IT  Frisaba la edad de nuestro hidalgo con los cin...   
    4  431234      ES  Es, pues, de saber que este sobredicho hidalgo...   
    
            KEYWORDS  
    0         Mancha  
    1        hidalgo  
    3  hidalgo, años  
    4        hidalgo  
    

    【讨论】:

    • 它返回以下错误:error: unterminated character set at position 6893
    猜你喜欢
    • 2014-03-13
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2015-09-24
    • 2014-01-17
    • 2011-01-15
    相关资源
    最近更新 更多