我有一个数据集,如下所示:
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 种模式如下
3-4mm
(int-intmm(NaN
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
以填充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
值并在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