Python Pandas:String包含但不包含

Sam*_*rry 5 python dataframe pandas

我正在尝试匹配包含和不包含某些字符串的Pandas DataFrame的行.例如:

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

输出:

0    ab1
1    ab2
2     b2
dtype: object
Run Code Online (Sandbox Code Playgroud)

期望的输出:

2     b2
dtype: object
Run Code Online (Sandbox Code Playgroud)

问题:是否有一种优雅的方式来说这样的话?

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

max*_*moo 7

你几乎就在那里,你只是没有正确的语法,它应该是:

df[(df.str.contains("b") == True) & (df.str.contains("a") == False)]
Run Code Online (Sandbox Code Playgroud)

如果您有很多条件要应用,那么另一种可能更清洁的方法是将过滤器与reduce或循环链接在一起:

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
Run Code Online (Sandbox Code Playgroud)

  • 不需要使用 == True ,可以使用补码运算符 tilda `~` 代替 == False (3认同)

beh*_*uri 6

或者:

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

或使用正则表达式:

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