Pandas中使用|运算符筛选价格最值行返回空数据集求助
问题根源:运算符优先级搞的鬼!
嘿,这个问题我碰到过好多次啦——你代码里的问题完全是Python运算符优先级在捣乱!
为什么你的一行代码返回空?
在Python中,位运算符|的优先级高于比较运算符==。所以你写的:
df[df['price'] == (df['price'].min()) | (df['price'].max())]
实际上被Python解释成了:
df[df['price'] == (df['price'].min() | df['price'].max())]
也就是先对最小价格和最大价格做位运算,得到一个和业务逻辑无关的数值,再用这个数值和price列做比较——这显然和你想要的“筛选出价格等于最小值 OR 最大值”的逻辑完全不符,自然返回空数据集。
正确的写法
你需要给每个比较表达式单独加上括号,确保先执行比较(得到布尔值序列),再执行逻辑或操作:
df[(df['price'] == df['price'].min()) | (df['price'] == df['price'].max())]
这样就能正确筛选出价格为最小或最大值的行了。
为什么拆分执行能成功?
当你拆分写的时候:
df1 = df[df['price'] == df['price'].min()] df2 = df[df['price'] == df['price'].max()] df3 = pd.concat([df1, df2], ignore_index=True)
每一步都是先完成了==比较,得到正确的布尔索引,然后直接把两个结果拼接起来,完全避开了运算符优先级的坑,所以能得到预期的4行数据。
更简洁的替代方案
其实还有个更直观的写法,用isin()方法,完全不用考虑运算符优先级:
df[df['price'].isin([df['price'].min(), df['price'].max()])]
这个写法可读性更高,也不容易出错~
内容的提问来源于stack exchange,提问作者VINAY DM
相关产品推荐
相关产品推荐

