我想在其中一列上使用正则表达式干净地过滤数据框。
对于一个人为的例子:
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
这让我人为地把一组人放进了正则表达式,但似乎也许不是干净的方式。有更好的方法吗?
答案 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
调用匹配来获取布尔结果。记录了这一点(以及match
和contains
)here之间的差异。
答案 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)
编写一个检查正则表达式的布尔函数,并在列
上使用applyfoo[foo['b'].apply(regex_function)]
答案 6 :(得分:1)
使用str
切片
foo[foo.b.str[0]=='f']
Out[18]:
a b
1 2 foo
2 3 fat