【问题标题】:searching matching string pattern from dataframe column in python pandas从python pandas的数据框列中搜索匹配的字符串模式
【发布时间】:2016-08-12 22:44:36
【问题描述】:

我有一个如下所示的数据框

 name         genre
 satya      |ACTION|DRAMA|IC|
 satya      |COMEDY|BIOPIC|SOCIAL|
 abc        |CLASSICAL|
 xyz        |ROMANCE|ACTION|DARMA|
 def        |DISCOVERY|SPORT|COMEDY|IC|
 ghj        |IC|

现在我想查询数据框,以便获得第 1,5 和 6 行。我想找到 |IC|单独或与其他类型的任何组合。

到目前为止,我可以使用

进行精确搜索
df[df['genre'] == '|ACTION|DRAMA|IC|']  ######exact value yields row 1

或字符串包含搜索依据

 df[df['genre'].str.contains('IC')]  ####yields row 1,2,3,5,6
 # as BIOPIC has IC in that same for CLASSICAL also

但我不想要这两个。

#df[df['genre'].str.contains('|IC|')]  #### row 6
# This also not satisfying my need as i am missing rows 1 and 5

所以我的要求是找到具有 |IC| 的流派。 (我的字符串搜索失败,因为 python 将 '|' 视为 or 运算符)

有人建议一些 reg 或任何方法来做到这一点。感谢 ADv。

【问题讨论】:

    标签: python regex string pandas


    【解决方案1】:

    我认为您可以将\ 添加到正则表达式以进行转义,因为没有\ 的| 被解释为OR:

    '|'

    A|B,其中 A 和 B 可以是任意 RE,创建一个匹配 A 或 B 的正则表达式。任意数量的 RE 可以用“|”分隔这样。这也可以在组内使用(见下文)。扫描目标字符串时,REs 由 '|' 分隔从左到右尝试。当一个模式完全匹配时,该分支被接受。这意味着一旦 A 匹配,B 将不会被进一步测试,即使它会产生更长的整体匹配。换句话说,'|'运营商从不贪婪。要匹配文字“|”,请使用 \|,或将其括在字符类中,如 [|]。

    print df['genre'].str.contains(u'\|IC\|')
    0     True
    1    False
    2    False
    3    False
    4     True
    5     True
    Name: genre, dtype: bool
    
    print df[df['genre'].str.contains(u'\|IC\|')]
        name                        genre
    0  satya            |ACTION|DRAMA|IC|
    4    def  |DISCOVERY|SPORT|COMEDY|IC|
    5    ghj                         |IC|
    

    【讨论】:

      【解决方案2】:

      可能是这样的结构:

          pd.DataFrame[DataFrame['columnName'].str.contains(re.compile('regex_pattern'))]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-31
        • 2014-05-07
        • 1970-01-01
        • 1970-01-01
        • 2013-07-11
        • 1970-01-01
        相关资源
        最近更新 更多