【问题标题】:Searching in Pandas Dataframe in Python在 Python 中搜索 Pandas 数据框
【发布时间】:2018-12-24 04:26:06
【问题描述】:

拥有一个包含 ngram 意大利语文本的数据框。看起来像这样:

    Name
0   accensione del drive ribobinatrice ho
1   actions urgente proporre al cliente
2   al cliente upgrade del drive
3   al drive con una smontata
4   causa di un problema di

我想搜索单词组合'cliente problema'

按照我的逻辑,它应该给我行号 1,2 和 4。

使用contains() 的方法,但它返回空系列:

Term = 'cliente problema'

x_word = df_pentagrams.Name[df_pentagrams.Name.str.contains(Term)]

如何在 Pandas 中解决这个问题?

谢谢!

【问题讨论】:

    标签: python string pandas dataframe contains


    【解决方案1】:

    尝试使用“|”字符以在搜索字符串中加入您的单独术语。目前,您的代码尝试匹配整个 'cliente problema' 字符串,您的行都不包含该字符串。

    df = pd.DataFrame(data = ['accensione del drive ribobinatrice ho',
    'actions urgente proporre al cliente',
    'al cliente upgrade del drive',
    'al drive con una smontata',
    'causa di un problema di',], columns = ['Name'])
    
    Term = 'cliente problema'
    
    x_word = df.Name[df.Name.str.contains('|'.join(Term.split(' ')))]
    

    【讨论】:

    • 此方法可能不适合,因为它不会过滤Name 中的单词,例如problematic 会被抓到。
    【解决方案2】:

    您对str.contains 的行为的期望是错误的。当您在示例中使用str.contains 时,您正在搜索显式字符串cliente problema,但根据您的期望,您不是在寻找clienta problema 作为字符串,而是在寻找clientaproblema 发生在任何记录中。

    您应该将该字符串拆分为一个列表,然后在过滤DataFrame 时使用该列表,而不是将clienta problema 视为字符串:

    terms = term.split(' ')
    df_penagrams.Name[df_pentagrams.Name.str.contains('|'.join(terms))
    

    【讨论】:

    • 此方法可能不适合,因为它不会过滤Name 中的单词,例如problematic 会被抓到。
    【解决方案3】:

    问题是您正在搜索 exact 字符串 'cliente problema' 而不是 'cliente' OR 'problema'。

    这就是你想要做的:

        Term1 = 'cliente' 
        Term2 = 'problema'
    
        x_word = df_pentagrams.Name[df_pentagrams.Name.str.contains(Term1) 
    | df_pentagrams.Name.str.contains(Term2)]
    

    【讨论】:

    • 我的答案是在我看到小牛肉之前发布的。我更喜欢他们的解决方案,因为它可以扩展到任意数量的搜索词。
    • 此方法可能不适合,因为它不会过滤Name 中的单词,例如problematic 会被抓到。
    【解决方案4】:

    您可以使用正则表达式或列表推导来过滤单词:

    df = pd.DataFrame({'Name': ['accensione del drive ribobinatrice ho',
                                'actions urgente proporre al cliente',
                                'al cliente upgrade del drive',
                                'al drive con una smontata',
                                'causa di un problema di']})
    
    Term = 'cliente problema'
    
    # regex
    p = '|'.join(Term.split())
    res = df[df['Name'].str.contains(r'\b{}\b'.format(p))]
    
    # list comprehension
    res = df[[any(i in words for i in Term.split()) \
              for words in df['Name'].str.split().values]]
    
    print(res)
    
                                      Name
    1  actions urgente proporre al cliente
    2         al cliente upgrade del drive
    4              causa di un problema di
    

    【讨论】:

      猜你喜欢
      • 2021-07-25
      • 2021-03-26
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 2022-11-01
      • 2022-01-03
      • 1970-01-01
      • 2021-03-08
      相关资源
      最近更新 更多