如何在Pandas中向量化iloc多条件判断?含报错解决
解决Pandas中连续多行条件判断的真值模糊问题
首先,咱们来拆解你遇到的ValueError:你代码里的df['busy'].iloc[i:i+3] >90返回的是一个包含3个布尔值的Series,直接把两个这样的Series用&连接,Pandas不知道你要的是所有行都满足条件还是任意一行满足,所以才会提示你用.all()或.any()来明确逻辑。
你的需求是连续3行同时满足%busy>90且%queue>=3,所以需要用.all()来确认切片里的每一行都符合条件。另外还要注意几个细节:
- 循环的索引范围要调整,避免超出数据边界(i最多只能到
total_row - 3,不然i:i+3会取到空数据); - 逻辑运算符
&的优先级比比较运算符低,所以每个条件要加括号; - 你的样本数据里第2-4行的
%busy是90,如果你要的是大于90,这三行其实不满足,可能是笔误,应该是>=90?
修正后的循环版本代码
import pandas as pd df = pd.read_csv('cpu.csv') total_row = df.shape[0] # 调整循环范围,避免切片越界 for i in range(total_row - 2): # 对每个切片的条件用.all()得到单个布尔值,同时加括号保证优先级 busy_condition = (df['busy'].iloc[i:i+3] >= 90).all() queue_condition = (df['queue'].iloc[i:i+3] >= 3).all() if busy_condition & queue_condition: print("High usage observed") break else: print("No high usage found")
更高效的向量化实现(无需循环)
既然用了Pandas,尽量避免手动循环,用滚动窗口(rolling)来实现更符合向量化的风格。考虑到你用的是Pandas 0.18.1(版本比较老,没有rolling.all()方法),我们可以用rolling.apply()来自定义判断逻辑:
import pandas as pd df = pd.read_csv('cpu.csv') # 定义函数判断窗口内的所有行是否满足条件 def check_high_usage(window): # window是一个包含3行的DataFrame busy_ok = (window['busy'] >= 90).all() queue_ok = (window['queue'] >= 3).all() return busy_ok & queue_ok # 用rolling(window=3)滑动窗口,apply自定义函数 # 设置axis=0保证按行处理窗口内的数据 has_high_usage = df.rolling(window=3, axis=0).apply(check_high_usage).any() if has_high_usage: print("High usage observed") else: print("No high usage found")
这段代码会自动检查所有连续3行的窗口,只要有一个窗口满足条件就会返回True,完美符合你的需求。
内容的提问来源于stack exchange,提问作者Rafiq Shaikh
相关产品推荐
相关产品推荐

