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

时间:2013-03-10 17:23:40

标签: python regex 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

这让我人为地把一组人放进了正则表达式,但似乎也许不是干净的方式。有更好的方法吗?

7 个答案:

答案 0 :(得分:142)

改为使用contains

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

答案 1 :(得分:15)

使用dataframe进行多列搜索:

frame[frame.filename.str.match('*.'+MetaData+'.*') & frame.file_path.str.match('C:\test\test.txt')]

答案 2 :(得分:10)

这可能有点晚了,但现在在熊猫中更容易做到。您可以使用as_indexer=True调用匹配来获取布尔结果。记录了这一点(以及matchcontainshere之间的差异。

答案 3 :(得分:9)

已经有一个字符串处理函数Series.str.startwith()

您应该尝试foo[foo.b.str.startswith('f')]

结果:

a   b
1   2   foo
2   3   fat

我想你的期望。

答案 4 :(得分:6)

感谢@ user3136169的一个很好的回答,这是一个示例的示例,该示例也可以删除NoneType值。

'NaN'

答案 5 :(得分:4)

编写一个检查正则表达式的布尔函数,并在列

上使用apply
foo[foo['b'].apply(regex_function)]

答案 6 :(得分:1)

使用str切片

foo[foo.b.str[0]=='f']
Out[18]: 
   a    b
1  2  foo
2  3  fat