2015-12-03 100 views
4

我试图匹配包含并不包含某些字符串的Pandas DataFrame的行。例如:Python熊猫:字符串包含并不包含

import pandas 
df = pandas.Series(['ab1', 'ab2', 'b2', 'c3']) 
df[df.str.contains("b")] 

输出:

0 ab1 
1 ab2 
2  b2 
dtype: object 

所需的输出:

2  b2 
dtype: object 

问:有没有说像这样的一个优雅的方式?

df[[df.str.contains("b")==True] and [df.str.contains("a")==False]] 
# Doesn't give desired outcome 

回答

4

就快,你只是没有得到语法完全正确的,它应该是:

df[(df.str.contains("b") == True) & (df.str.contains("a") == False)] 

另一种可能更清洁的方法,如果你有很多的条件,申请将要到链中的过滤器连同减少或循环:

from functools import reduce 
filters = [("a", False), ("b", True)] 
reduce(lambda df, f: df[df.str.contains(f[0]) == f[1]], filters, df) 
#outputs b2 
3

或者:

>>> ts.str.contains('b') & ~ts.str.contains('a') 
0 False 
1 False 
2  True 
3 False 
dtype: bool 

或使用正则表达式: