代码之家  ›  专栏  ›  技术社区  ›  Arthur D. Howland

python3通过正则表达式和通配符过滤数据帧

  •  1
  • Arthur D. Howland  · 技术社区  · 6 年前

    使用文本数据集时,我有一个在数据帧中给出不规则结果的提取。我不是很擅长正则表达式,从来没有做过一个过滤器尝试一个这样的帮助将不胜感激。

    我正在尝试筛选a列中的第4行;6模式是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的pythonic方法是什么?查看列a中的前20个字符并对其进行模式匹配?

    1 回复  |  直到 6 年前
        1
  •  5
  •   asongtoruin    6 年前

    根据给定的规则,您可以使用以下选项:

    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