【问题标题】:Pandas string.contains doesn't work if searched string contains the substring at the beginning of the string如果搜索的字符串包含字符串开头的子字符串,Pandas string.contains 不起作用
【发布时间】:2020-05-24 19:18:40
【问题描述】:

我正在使用 str.contains 搜索列包含特定字符串作为子字符串的行

df[df['col_name'].str.contains('find_this')]

这将返回“find_this”在字符串中某处的所有行。但是,在 df['col_name'] 中的字符串以 'find_this' 开头的罕见但重要的情况下,上述查询不会返回此行。

str.contains() 在应该返回 true 的地方返回 false。

任何帮助将不胜感激,谢谢!


编辑 我已按要求添加了一些示例数据。 Image of dataframe. 我想更新“Eqvnt_id”列,例如,“Course_ID”列包含 AAS 102 的行都具有相同的“Eqvnt_id”值。

为此,我需要能够在“Course_ID”中的字符串中搜索“AAS 102”,以便找到合适的行。但是,当我这样做时:

df[df['Course_ID'].str.contains('AAS 102')]

查询中没有出现“AAS 102 (ENGL 102, JST 102, REL 102)”的行!

数据类型都是对象。我已经尝试将它们映射并将它们应用于字符串类型,但它对查询的成功没有任何影响。

图片中的数据可以在https://github.com/isaachowen/stackoverflowquestionfiles找到

【问题讨论】:

  • 您能在您的问题中添加一些示例数据吗?因为我认为这是一些与数据相关的问题。
  • 这应该可以。您可能遇到一些数据编码问题。检查一下
  • @jezrael 和 Chayan,我添加了一个示例。我不确定您想到了什么数据编码问题,有什么想法吗?
  • 一个想法 - 真实数据中应该有 2 个或更多空格或制表符,最好将列转换为列表和检查
  • @jezrael 不幸的是,事实并非如此。我已经制作了另一列以逗号分隔的值列表(仍然是一个字符串),并且存在相同的问题。该示例只是“AAS 102,ENGL 102,JST 102,REL 102”

标签: python string pandas substring contains


【解决方案1】:

TLDR:尝试使用 pandas.Series.str.normalize(),尝试不同的 Unicode 形式,直到问题得到解决。 “NFKC”对我有用。

问题与我正在执行的列中的数据格式有关...

df['column'].str.contains('substring') 

...开始操作。使用 pandas.Series.str.normalize() 函数有效。 Link here. 有时,在某些我无法刻意重新创建的情况下,字符串会在字符串的开头或结尾附加 '\xa0' 和 '\n' 。 This post 帮助解决如何处理该问题。在那篇文章之后,我循环遍历了每个字符串列并更改了 unicode 形式,直到找到有效的方法:'NFKC'。

【讨论】:

    【解决方案2】:

    您可以改用 pandas.Series.str.find() - 它返回找到字符串的索引 - 如果它在开头,则返回的索引将为 0。如果找不到字符串,则返回 - 1.

    df[df['col_name'].str.find('find_this') != -1]
    

    如果这有帮助,请告诉我!

    【讨论】:

    • 有什么解释为什么这个答案被否决了吗?
    • 我不确定为什么这被否决了,尽管当我尝试代码时遇到了同样的问题。有人说这可能是数据类型问题,但我不确定如何更改列中的数据才能正常工作。
    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 2014-10-15
    • 2011-05-25
    • 2021-05-30
    • 2013-08-14
    • 2021-06-12
    • 1970-01-01
    • 2017-10-19
    相关资源
    最近更新 更多