regex - 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 方法?
解决方案
您可以根据给定的规则使用以下内容:
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