如何使用正则表达式识别无效模式?



我有一个数据集,如下所示:

import pandas as pd
dic={"ID":[1,2,3,4,5,6],
"Size":["3-4mm","12mm",math.nan,"1 mm","1mm, 2mm, 3mm","13*18mm"]}
dt = pd.DataFrame(dic)

因此,数据集是:

ID           Size
1           3-4mm
2           12mm
3           NaN
4           1 mm
5           1mm, 2mm, 3mm
6           13*18mm

在列Size中,i 应该只有 3 个有效模式除了这 3 个之外的任何模式都是无效的。这 3 种模式如下

  1. 3-4mm(int-intmm(
  2. NaN
  3. 4mm(国际(

我想知道我如何拥有指定具有无效大小模式的行ID的功能?

所以,在我的例子中:

ID
4
5
6

原因是它们的大小格式无效。 我对解决方案没有偏好,但我想最简单的解决方案来自Regx

使用 @CodeManiac 的模式,您可以将其传递给series.str.contains()并将na参数作为True传递,因为它是实际的 NaN:

dt.loc[~dt.Size.str.contains('^(?:d+-d+mm|d+mm)$',na=True),'ID']

3    4
4    5
5    6

详:

正在执行:dt.Size.str.contains('^(?:d+-d+mm|d+mm)$')

0     True
1     True
2      NaN
3    False
4    False
5    False

传递na=True以填充NaNTrue

dt.Size.str.contains('^(?:d+-d+mm|d+mm)$',na=True)
0     True
1     True
2     True
3    False
4    False
5    False

然后使用反转~True反转为False反转,反之亦然,因为我们想要False值并在df.loc[]下调用ID

返回'Size'列中值无效的行的'ID'-s 的函数:

import re  # standard Python regular expressions module
def get_invalid(dt):
return dt[dt['Size'].apply(lambda r: re.match(r'^d+-d+mm|nan|d+mm$', str(r), re.MULTILINE) is None)]['ID']

输出:

3    4
4    5
5    6
Name: ID, dtype: int64

最新更新