如何用正则表达式过滤pandas中的行
我想用正则表达式来干净利落地过滤一个数据框中的某一列。
举个简单的例子:
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
来实现这个功能变得更简单了。文档中解释了 match
、fullmatch
和 contains
之间的区别。
请注意,为了使用结果进行索引,设置 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