【问题标题】:Python 3 Pandas filter a dataframe by regular expression and wildcardPython 3 Pandas 通过正则表达式和通配符过滤数据框
【发布时间】:2019-02-21 10:44:39
【问题描述】:

使用文本数据集时,我有一个提取,它在数据框中给我不规则的结果。我对正则表达式不太擅长,并且从未尝试过过滤器,因此不胜感激。

我正在尝试过滤第 4 行和第 6 行的列 a。模式是 4 个数字、一个字母、一个空格、/ 空格、2 个数字、空格、/、空格、5 个数字、空格、/,然后是下面的任何内容.

数据框如下所示:

    a                            b          c            d
0   1234B:Program Name / Title   Chapter    Page Number  ID Code
1   1234B:Program Name / Title   Chapter    Page Number  ID Code
2   1234B:Program Name / Title   Chapter    Page Number  ID Code
3   1234B / 01 / 2               (blank)    (blank)      ID Code
4   1234B / 01 / 23456 / Title   Chapter    Page Number  ID Code   <---- Filter for this
5   1234B / 01 / 2               (blank)    (blank)      ID Code
6   1234B / 01 / 23456 / Title   Chapter    Page Number  ID Code   <---- Filter for this

我试过以下代码:

# Filter by pattern
import pandas as pd
import numpy as np
import re
pattern = re.compile("[0-9][0-9][0-9][0-9][B][\s][/][\s][0-9][0-9][\s][/][\s][0-9][0-9][0-9][0-9][0-9][\s]+[/]")
df = df[df['a'].apply(pattern)]

结果是 TypeError:'_sre.SRE_Pattern' 对象不可调用。看来我应用错了。此外,我的正则表达式没有通配符来说明 a 列中的其余数据。过滤列 A 以查看 A 列中的前 20 个字符并对其进行模式匹配的 Pythonic 方法是什么?

【问题讨论】:

    标签: regex python-3.x pandas


    【解决方案1】:

    您可以根据给定的规则使用以下内容:

    df = df[df['a'].str.match(r'\d{4}[a-zA-z]\s\/\s\d{2}\s\/\s\d{5}\s\/.*')]
    

    这给出了:

                                a        b            c        d
    4  1234B / 01 / 23456 / Title  Chapter  Page Number  ID Code
    6  1234B / 01 / 23456 / Title  Chapter  Page Number  ID Code
    

    【讨论】:

    • 这行得通,以前从未在过滤器上见过 .str.match 。那么最后一个表达式“/.*'”必须是通配符。
    • 正则表达式中的 @ArthurD.Howland .* 是任意字符零次或多次。如果您想更好地了解它的工作原理,您应该尝试regex tutorial
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2015-12-13
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多