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

Pandas rolling+lambda运行异常及赋值后列全NaN问题求助

问题分析与解决方案

一、rolling.apply运行极慢的问题

原因

你使用的rolling(2).apply(lambda x: x.iloc[1] > x.iloc[0])属于逐窗口调用Python函数的循环操作,Pandas对这种Python级别的循环优化极差。150万行数据意味着要执行近150万次函数调用,这就是代码“无限运行”的核心原因。视频中60万行数据运行快,只是因为数据量小,且大概率视频作者实际用了更高效的向量化操作但未展示细节。

解决方法

替换为向量化比较,彻底规避循环,速度能提升几个数量级:

# 等价原逻辑:判断当前行Close是否大于前一行,第一行自动为NaN
data['Target'] = sp500['Close'] > sp500['Close'].shift(1)

二、赋值后列全为NaN的问题

原因

核心是索引不匹配。从sp500计算出的结果,其索引与data的索引未对齐。Pandas赋值时会严格按索引匹配,data中找不到对应索引的位置会自动填充NaN。比如sp500用日期做索引,而data用自增整数做索引,或者两者索引范围不一致,就会导致df.head()展示的前几行没有匹配的索引值,最终显示全NaN。

解决方法

  1. 先验证索引是否一致:
print(sp500.index.equals(data.index))
  1. 若索引不一致,可选两种处理方式:
    • 重置索引后按位置赋值(忽略索引):
      target_series = sp500['Close'] > sp500['Close'].shift(1)
      data['Target'] = target_series.reset_index(drop=True)
      
    • 直接用值数组赋值(完全按位置匹配):
      data['Target'] = (sp500['Close'] > sp500['Close'].shift(1)).values
      
    • 对齐两个数据集的索引后再赋值(比如将data的索引修改为与sp500一致)。

内容的提问来源于stack exchange,提问作者tonycor nikolauos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:55:14