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。
解决方法
- 先验证索引是否一致:
print(sp500.index.equals(data.index))
- 若索引不一致,可选两种处理方式:
- 重置索引后按位置赋值(忽略索引):
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
相关产品推荐
相关产品推荐

