过滤熊猫中的行

时间:2020-08-11 02:02:47

标签: python regex pandas

我需要找到具有以下条件的普通用户

  • 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
...          ...

我应该做的是

  • 首先找到在CODE中具有AA的所有用户ID,即A12和J43;
  • 找到所有在CODE中拥有__的用户,即A12和M54;
  • 查找所有在CODE中具有数字的用户,即F453,L32和M54。

我尝试使用正则表达式过滤用户,如果有数字(也可以使用^[^0-9]*$,则使用df.CODE.str.contains('^\d+\',如果是/[$-/:-?{-~!"^_[]]/,则过滤器使用__

2 个答案:

答案 0 :(得分:4)

您可以将|(或)与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

答案 1 :(得分:2)

您可以将字符串访问器用于系列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

稍后可以使用这些掩码中的每一个来过滤数据帧。在这种情况下,最好将它们保留为单独的遮罩,因为它们似乎有重叠。