【问题标题】:How to identify invalid pattern using regx?如何使用正则表达式识别无效模式?
【发布时间】:2019-08-31 11:27:29
【问题描述】:

我有一个如下数据集:

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 个之外的任何东西都是无效的。这3种模式如下

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

我想知道我怎样才能拥有指定具有无效大小模式的行的ID 的函数?

所以,在我的例子中:

ID

4
5
6

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

【问题讨论】:

  • @CodeManiac 你能写一个完整的答案吗?此外,它似乎选择了有效模式,同时我要求 invalids
  • 使用@CodeManiac 正则表达式模式,执行如下操作:dt.loc[~dt.Size.str.contains('^(?:\d+-\d+mm|\d+mm)$',na=True),'ID']
  • @anky_91 随时作为答案发布
  • @anky_91 我不熟悉 python 语法,所以无法用正确的语法解释来创建答案,我很高兴你可以继续发帖 :)

标签: regex python-3.x pandas


【解决方案1】:

使用@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 值并调用ID 下的IDdf.loc[]

【讨论】:

  • 附注:- 可以进一步缩短为^\d+(?:-\d+)?$
【解决方案2】:

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

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

【讨论】:

  • 这不需要re.IGNORECASE 来匹配NaNnan 等吗?另外,True / False 匹配测试是否严格要求捕获组?
  • 谢谢。我可以理解rre 是什么?
  • @MurrayW:不,不需要re.IGNORECASE,因为str(math.nan) 只是'nan'。当然根本不需要捕获组。
  • @Jeff:re 是用于正则表达式的标准 Python 模块。请查看更新后的代码。
  • @sophros 我们可以用dataframe.filter 做同样的事情吗?
猜你喜欢
  • 2013-10-07
  • 2022-12-04
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多