我试图匹配包含且不包含某些字符串的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.str.contains("a")==False]]
# Doesn't give desired outcome
答案 0 :(得分:7)
你几乎就在那里,你只是没有正确的语法,它应该是:
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
答案 1 :(得分:5)
或者:
>>> 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
答案 2 :(得分:1)
您可以使用.loc和〜进行索引:
df.loc[(df.str.contains("b")) & (~df.str.contains("a"))]
2 b2
dtype: object