You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 17:55:17