如何使用regx识别无效模式?

时间:2019-08-31 11:27:29

标签: regex python-3.x pandas

我有一个如下的数据集:

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列中,我应该只有 3个有效模式,并且 除这3个无效模式之外的任何其他 。这三种模式如下

  1. 3-4mm(int-intmm)
  2. NaN
  3. 4mm(intmm)

我想知道我该如何使用指定无效大小模式的行中的ID的功能?

因此,在我的示例中:

ID

4
5
6

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

2 个答案:

答案 0 :(得分:2)

使用@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以将NaN填充为True

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的值并调用{{3}下的ID列}

答案 1 :(得分:1)

该函数返回'ID'列中无效值的'Size'-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