问题描述
我需要找到具有以下条件的普通用户
- CODE中的模式AA;
- CODE中的模式
__
; - CODE中的数字;
数据集如下:
User_ID CODE
A12 AAada __fa
F453 21 ads
J43 Has AA
... ...
H21 MNasdf
L32 sad 21
M54 43__12 asd
... ...
我应该做的是
我尝试使用正则表达式过滤用户,如果有数字(也可以使用^[^0-9]*$
,则使用df.CODE.str.contains('^\d+\'
,如果是/[$-/:-?{-~!"^_[]]/
,则过滤器使用__
。
解决方法
您可以将|
(或)与str.contains()
和|
结合使用,以分隔三种模式:
df = df[df['CODE'].str.contains('\d|__|AA')]
Out[3]:
User_ID CODE
0 A12 AAada __fa
1 F453 21 ads
2 J43 Has AA
5 L32 sad 21
6 M54 43__12 asd
,
您可以将字符串访问器用于系列series.str.contains()
。这是user guide
以及解决方案的代码
pats = ['AA','__','\d']
mask = {}
for pat in pats:
mask[pat] = df.CODE.str.contains(pat,regex=True)
# regex=True is default,shown here for demonstration
print()
print(mask[pat])
输出
0 True
1 False
2 True
3 False
4 False
5 False
Name: CODE,dtype: bool
0 True
1 False
2 False
3 False
4 False
5 True
Name: CODE,dtype: bool
0 False
1 True
2 False
3 False
4 True
5 True
Name: CODE,dtype: bool
稍后可以使用这些掩码中的每一个来过滤数据帧。在这种情况下,最好将它们保留为单独的遮罩,因为它们似乎有重叠。