使用Pandas筛选DataFrame中reports列值在10~31间行的错误排查
问题出在逻辑运算符的使用上!
你想要筛选reports值在10~31之间的行,但错误地用了逻辑或(|),而不是需要的逻辑与(&)。
为什么原来的代码会得到错误结果?
你的条件(df.reports >= 10) | (df.reports <= 31)表达的是「只要满足其中一个条件就保留该行」,但实际上任何数值都符合这个或条件:
- 比如
reports=47,它满足>=10,所以被保留; reports=6满足<=31,也被保留;
最终所有行都被选中,完全不符合你要的「10到31之间」的需求。
正确的代码实现
这里给你三种可行的写法,都能得到正确结果:
1. 布尔索引(修正运算符)
把|换成&,记得每个条件用括号包裹(避免Pandas的运算符优先级问题):
df_4 = df[(df.reports >= 10) & (df.reports <= 31)]
2. query方法(两种写法)
要么替换运算符,要么直接用更直观的连续比较:
# 替换运算符的写法 df_5 = df.query('reports >= 10 & reports <= 31') # 更符合自然语言的写法 df_5 = df.query('10 <= reports <= 31')
3. 用between()方法(最简洁)
Pandas专门提供了between()方法来处理区间筛选,默认包含边界值(正好匹配你的10~31需求):
df_6 = df[df.reports.between(10, 31)] # 也可以在query里使用 df_6 = df.query('reports.between(10, 31)')
正确的输出结果
运行以上任意一种代码,你会得到符合预期的筛选结果:
month of entry name reports 0 20171002 Jason 14 1 20171206 Molly 24 2 20171208 Tina 31 3 20171018 Jake 22 8 20171115 David 14 9 20171030 Jack 10
内容的提问来源于stack exchange,提问作者Mark K
相关产品推荐
相关产品推荐

