对DataFrame执行迭代循环时出现Value Error问题的咨询
报错根因
你遇到的ValueError是因为df.loc[i-2:i+2, 'MF1 Trans-Membrane Pressure (kPa) (PDI3423)']返回的是长度为5的Series对象,Series > 0会生成同长度的布尔Series,Python原生if语句无法直接判断布尔Series的真值,因此抛出歧义错误。
循环实现修复方案
你只需要在窗口判断后追加聚合方法,明确判断规则即可:
- 若要求窗口内所有压力值都大于0才触发标记,使用
.all() - 若要求窗口内只要有一个压力值大于0就触发标记,使用
.any()
另外你原代码里的while逻辑完全冗余,循环体不管判断结果如何都会执行break,直接替换为if即可,修复后的完整代码如下:
import numpy as np import pandas as pd def backwash(df): df.loc[0, 'backwash'] = np.NaN # 提前把列名存成变量,避免重复写长串字符出错 flow_col = 'MF1 Permeate Flow (m3/min)' pressure_col = 'MF1 Trans-Membrane Pressure (kPa) (PDI3423)' for i in range(3, len(df)-2): if df.loc[i, flow_col] == 0: # 根据你的实际需求二选一即可,这里默认用全大于0的规则示例 if (df.loc[i-2:i+2, pressure_col] > 0).all(): # 如果是只要有一个大于0就用下面这行 # if (df.loc[i-2:i+2, pressure_col] > 0).any(): df.loc[i, 'backwash'] = 'BW' return df
可选优化(非循环,性能更高)
如果你的数据量较大,循环执行效率较低,可以用pandas的滚动窗口函数直接向量化计算,不需要写循环:
def backwash_vectorized(df): flow_col = 'MF1 Permeate Flow (m3/min)' pressure_col = 'MF1 Trans-Membrane Pressure (kPa) (PDI3423)' df['backwash'] = np.nan # 生成5行长度的居中滚动窗口,判断窗口内所有压力值>0 pressure_condition = df[pressure_col].rolling(window=5, center=True).apply(lambda x: (x>0).all()) == 1 # 流量为0的条件 flow_condition = df[flow_col] == 0 # 同时满足两个条件的行标记为BW df.loc[pressure_condition & flow_condition, 'backwash'] = 'BW' return df
内容的提问来源于stack exchange,提问作者Aimas
相关产品推荐
相关产品推荐

