【问题标题】:How to select rows based off a column entry using regex to filter?如何使用正则表达式过滤基于列条目选择行?
【发布时间】:2018-10-29 02:03:43
【问题描述】:

这是我正在使用的数据框的示意图(注意,这是一个代表性示例,并不意味着展示任何列中的所有可能条目):

Name | Screen | Placeholder for other columns

Bill | GHRF (OOC) | text

Bob | GHRF (IC) | text

Sue | IRMS/CIR (OOC) | text

John | GHRF ISOFORMS IRMS CIR (OOC) | text

我正在尝试选择 Screen 列中具有 (OOC) 的所有行。

通常,我会使用类似 dfnew = df[df['Column'] == 'Criteria'] 的内容过滤数据框,但这不适用于正则表达式。

我也尝试过dfnew = df[df['Screen'].filter(regex = r'OOC', axis = 0)],我认为它会起作用,但没有。

有人可以向我解释如何使用正则表达式根据列条目选择行吗?

我想结束的是这样的:

Name | Screen | Placeholder

Bill | GHRF (OOC) | text

SUE | IRMS/CIR (OOC) | text

John | GHRF ISOFORMS IRMS CIR (OOC) | text

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    DataFrame.filter 过滤列名,而不是值。你正在寻找str.contains

    dfnew = df[df['Screen'].str.contains(r'\(OOC\)')]
    

    或者,如果您不需要正则表达式,请将其关闭——

    dfnew = df[df['Screen'].str.contains(r'(OOC)', regex=False)]
    

    print(dfnew)
       Name                        Screen
    0  Bill                    GHRF (OOC)
    2   Sue                IRMS/CIR (OOC)
    3  John  GHRF ISOFORMS IRMS CIR (OOC)
    

    如果您打算对 dfnew 进行更多索引/分配,我建议您改为使用

    dfnew = df[df['Screen'].str.contains(r'\(OOC\)')].copy()
    

    为了避免以后出现SettingWithCopyWarning

    【讨论】:

    • 感谢您的建议!另一位响应者建议使用str.extract。如果您的建议对我来说更容易理解,则语法,尤其是正则表达式部分。我不认为您可以提供一些关于为什么str.contains 可能比str.extract 更可取的见解?两种方法都会产生预期的结果,我只是想弄清楚为什么我可能会使用其中一种。
    • @T.Kelly 实际上,如果您只是检查收容措施,我根本不推荐extractstr.contains 返回一个掩码。 “是还是不是”。 extract 将首先通过正则表达式捕获组提取值,然后对结果执行相等性检查。不需要正则表达式的蜿蜒两步方法。将str.contains 与此子字符串一起使用时,您甚至不需要正则表达式开关...只需使用regex=False 将其关闭即可。
    • @coldspped 太棒了,感谢您澄清“幕后”发生的事情。再次感谢您的帮助!
    【解决方案2】:

    我们可以试试str.extract

    df[df.Screen.str.extract('\((.*?)\)',expand=True)[0]=='OOC']
    

    【讨论】:

    • 感谢您的建议!另一位响应者建议使用str.contains。如果你的建议对我来说有点难以理解,特别是正则表达式部分。我不认为您可以提供一些关于为什么str.extract 可能比str.contains 更可取的见解?两种方法都会产生预期的结果,我只是想弄清楚为什么我可能会使用其中一种。
    • @T.Kelly 如果您只想过滤 OOC 行 m str.contains 更好,如果您需要将来使用括号之间的数据,extract 使用起来更舒服跨度>
    • 酷,非常感谢您的澄清。感谢您的宝贵时间!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多