Pandas DataFrame条件筛选语句执行结果不符合预期求助
问题原因分析
你遇到的问题核心是两个错误共同导致的:
- 运算符优先级错误:Pandas中
&(位与)的优先级远高于==(等于比较),你写的语句实际执行顺序和预期完全不符:
你预期的逻辑是:(条件A) & (条件B)
代码实际执行的是:[(左边的数值Series) & df['label']] == pairs[1][1] - Series索引对齐导致空值:你对
df.loc[:,'label']加了[df.index > (num_old_lbl - 1)]筛选后,得到的Series仅包含索引49的条目,和全量`df['label']`(索引09)做运算时,索引0~3的位置会被自动填充为NaN,NaN参与所有布尔运算的结果都是False。 - 你第一条语句结果符合预期完全是巧合,并非逻辑正确。
另外补充一点:你构造的df中,num_old_lbl为lbl的长度4,索引>3的行的label值依次为[0,1,2,3,4,5],pairs[1][1]的值是2,对应的是索引6的行(从1开始数是第7行),如果你的预期是第6行返回True,说明你对行号的计数或者数据构造可能还有细微偏差。
正确写法
如果要实现「索引大于num_old_lbl-1且label等于对应值」的逻辑,需要把两个条件都写为布尔表达式,分别用括号包裹后再做与运算:
import numpy as np import pandas as pd lbl = [0, 1, 2, 3] lbl2 = [0, 1, 2, 3, 4, 5] label = lbl + lbl2 df = pd.DataFrame({"label":label}) pairs =[] for i in range(3): pair = (i,i+1) pairs.append(pair) num_old_lbl = len(lbl) # 两个布尔条件分别用括号包裹,避免优先级问题 cond1 = df.index > (num_old_lbl - 1) cond2 = df['label'] == pairs[1][1] result = cond1 & cond2
运行后result的值为:
0 False 1 False 2 False 3 False 4 False 5 False 6 True 7 False 8 False 9 False dtype: bool
符合逻辑预期。
内容的提问来源于stack exchange,提问作者Minwoo Kang
相关产品推荐
相关产品推荐

