如何从pandas dataframe的指定列中筛选出包含特定取值的行?
问题原因
你代码的问题出在'failed' or 'successful'的写法上:Python的or是原生逻辑运算符,会直接对两侧的字符串做布尔判定,非空字符串的布尔值为True,因此整个表达式会直接返回第一个为真的值也就是'failed'。你写的筛选逻辑实际等价于df['state'].str.contains('failed', na=False),自然只能筛选到state为failed的行。你之前用相同写法得到正确结果属于巧合,该写法本身不符合语法逻辑。
正确实现方案
- 方案1:适配原有
str.contains写法,用正则的|分隔多个匹配项,适合模糊匹配场景:
df = df[df['state'].str.contains('failed|successful', na=False)]
注意该写法为模糊匹配,如果state列存在其他包含这两个字符串的取值(比如failed_audit)也会被命中,需要完全匹配推荐用方案2。
- 方案2:用
isin方法做精确值匹配,更符合筛选取值属于指定集合的需求,性能也更优:
df = df[df['state'].isin(['failed', 'successful'])]
该写法只会匹配state取值完全等于failed或successful的行,不会命中包含对应子串的其他取值。
- 方案3:分开写匹配条件,用pandas的按位或运算符
|拼接,适合需要灵活加其他筛选条件的场景:
df = df[(df['state'] == 'failed') | (df['state'] == 'successful')]
内容的提问来源于stack exchange,提问作者Bryan B
相关产品推荐
相关产品推荐

