Pandas多条件筛选异常:为何col1<2的第一行未被过滤?
问题原因与解决方案
核心问题:逻辑运算符优先级
你遇到的问题是逻辑运算符优先级导致的:在Pandas(以及Python)中,&(按位与)的优先级高于|(按位或)。你的原代码表达式:
df[(df['col1'] == 1) | (df['col1'] == df['col1'].max()) & (df['col1'] > 2)]
会被Python解释器自动解析为:
df[(df['col1'] == 1) | ((df['col1'] == df['col1'].max()) & (df['col1'] > 2))]
也就是说,先执行后面的&组合条件,再和前面的df['col1'] ==1做|运算。第一行的col1=1满足第一个条件,所以被保留下来,不符合你只保留最大值行的预期。
正确写法
如果你只想保留col1为最大值的行,直接简化条件即可:
import pandas as pd d = {'col1':[1, 2, 3, 4, 5], 'col2':[5, 4, 3, 2, 1]} df = pd.DataFrame(data=d) # 仅保留col1为最大值的行 df[df['col1'] == df['col1'].max()]
执行后会得到你预期的结果:
col1 col2 4 5 1
如果你的原表达式是想组合多个条件(比如保留col1=1或col1是最大值且大于2),但需要修正逻辑,只需给|两侧的条件加上括号,强制改变运算顺序:
df[((df['col1'] == 1) | (df['col1'] == df['col1'].max())) & (df['col1'] > 2)]
不过这个表达式里df['col1'] ==1和df['col1']>2是互斥的,所以结果依然只有最大值的行。
内容的提问来源于stack exchange,提问作者Rafael
相关产品推荐
相关产品推荐

