我想在其中一列上使用正则表达式干净地过滤数据框。
举一个人为的例子:
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
但是,这使我人为地将一组放入正则表达式中,并且似乎不是一种干净的方法。有一个更好的方法吗?
恕我直言,我认为这
—
tumultous_rooster15年
foo[foo.b.str.match('(f.*)').str.len() > 0]
是一个相当不错的解决方案!比startwith更具自定义性和实用性,因为它包含了regex的多功能性。
这可能会有点晚,但是在较新版本的熊猫中,此问题已解决。这条线
—
Behzad Mehrtash
foo[foo.b.str.match('f.*')]
对我来说在熊猫0.24.2中工作。
foo[foo.b.str.startswith("f")]
则可以使用。