我有一个如下的数据集:
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-4mm
(int-intmm)NaN
4mm
(intmm)我想知道我该如何使用指定无效大小模式的行中的ID
的功能?
因此,在我的示例中:
ID
4
5
6
原因是它们的大小格式无效。
我对解决方案没有偏爱,但我猜最简单的解决方案来自Regx
答案 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