首页 > 解决方案 > Python 3 Pandas 通过正则表达式和通配符过滤数据框

问题描述

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

我正在尝试为第 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 方法?

标签: regexpython-3.xpandas

解决方案


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

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

推荐阅读