遍历DataFrame时检查指定区间行多列条件报错求助
问题分析与解决
错误原因
你写的代码里,loc的用法完全错误:
- 第二个参数用
(data['TRAJ50_1'][i] < 0) & (data['TRAJ100_1'] < 0) & (data['TRAJ200_1'] < 0)是取第i行的三个列值做判断,得到的逻辑与切片区间i-150:i-30的索引不匹配,直接触发索引对齐错误。 - 就算条件写对,直接用
if判断DataFrame对象也不合法,必须先将结果转换为单一布尔值。
修正后的循环代码(适合新手理解)
先确保循环范围合理,避免出现负数索引,再正确检查区间内的所有行:
# 从第150条开始遍历,保证i-150不会小于0 for i in range(150, len(data)): # 取[i-150, i-31]的区间(Pandas切片左闭右开,i-31才能排除最后30条) window_data = data.loc[i-150:i-31, ['TRAJ50_1', 'TRAJ100_1', 'TRAJ200_1']] # 检查窗口内所有行的三列是否都小于0 # 第一层all()检查每行的所有列是否满足<0,第二层all()检查所有行是否都满足 all_negative = (window_data < 0).all().all() # 赋值1或0 _recent_decline = 1 if all_negative else 0 # 这里添加你后续使用_recent_decline的逻辑
高效向量化方案(Pandas推荐写法)
循环在大数据量下效率极低,用Pandas的滑动窗口功能实现更高效:
def check_all_negative(window): # 检查窗口内所有行的三列是否均小于0 return (window < 0).all().all() # 计算窗口大小为120(150-30),确保窗口是完整的120条记录 # shift(30)把窗口结果对应到原需求的位置,fillna填充开头的空值 data['_recent_decline'] = ( data[['TRAJ50_1', 'TRAJ100_1', 'TRAJ200_1']] .rolling(window=120, min_periods=120) .apply(check_all_negative, raw=False) .shift(30) .fillna(0) .astype(int) )
内容的提问来源于stack exchange,提问作者VictorKahn
相关产品推荐
相关产品推荐

