如何用正则表达式过滤pandas中的行

263 投票
10 回答
314476 浏览
提问于 2025-04-17 18:36

我想用正则表达式来干净利落地过滤一个数据框中的某一列。

举个简单的例子:

In [210]: foo = pd.DataFrame({'a' : [1,2,3,4], 'b' : ['hi', 'foo', 'fat', 'cat']})
In [211]: foo
Out[211]: 
   a    b
0  1   hi
1  2  foo
2  3  fat
3  4  cat

我想用正则表达式过滤出那些以 f 开头的行。第一次尝试:

In [213]: foo.b.str.match('f.*')
Out[213]: 
0    []
1    ()
2    ()
3    []

这个方法不是特别好。不过这样可以让我得到一个布尔索引:

In [226]: foo.b.str.match('(f.*)').str.len() > 0
Out[226]: 
0    False
1     True
2     True
3    False
Name: b

所以我可以通过这个布尔索引来进行限制:

In [229]: foo[foo.b.str.match('(f.*)').str.len() > 0]
Out[229]: 
   a    b
1  2  foo
2  3  fat

不过这样让我在正则表达式里强行加了一个分组,感觉这不是最好的方法。有没有更好的办法呢?

10 个回答

28

可能有点晚了,但现在在Pandas中通过调用 Series.str.match 来实现这个功能变得更简单了。文档中解释了 matchfullmatchcontains 之间的区别。

请注意,为了使用结果进行索引,设置 na=False 参数(如果想在结果中包含NAN值,则设置为 True)。

57

已经有一个处理字符串的函数叫做 Series.str.startswith()。你可以试试 foo[foo.b.str.startswith('f')]

结果:

    a   b
1   2   foo
2   3   fat

我想这就是你想要的结果。

另外,你也可以使用带有正则表达式选项的包含函数。比如:

foo[foo.b.str.contains('oo', regex= True, na=False)]

结果:

    a   b
1   2   foo

na=False 是为了防止出现错误,特别是当有 nan、null 等值的时候。

282

使用contains来代替:

In [10]: df.b.str.contains('^f')
Out[10]: 
0    False
1     True
2     True
3    False
Name: b, dtype: bool

撰写回答