Python熊猫:字符串包含和不包含';不包含

Python熊猫:字符串包含和不包含';不包含,python,pandas,dataframe,Python,Pandas,Dataframe,我正在尝试匹配熊猫数据帧中包含和不包含特定字符串的行。例如: 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.st

我正在尝试匹配熊猫数据帧中包含和不包含特定字符串的行。例如:

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
要么:

>>> ts.str.contains('b') & ~ts.str.contains('a')
0    False
1    False
2     True
3    False
dtype: bool
或使用正则表达式:

>>> ts.str.contains('^[^a]*b[^a]*$')
0    False
1    False
2     True
3    False
dtype: bool

就快到了,只是语法不太正确,应该是:

df[(df.str.contains("b") == True) & (df.str.contains("a") == False)]
如果你有很多条件可以应用,另一种可能更干净的方法是使用reduce或loop将你的过滤器链接在一起:

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

您可以使用.loc和~索引:

df.loc[(df.str.contains("b")) & (~df.str.contains("a"))]

2    b2
dtype: object

不需要使用==True,可以使用补码运算符tilda
~
代替==False