多索引DataFrame新增returns列赋值后全为NaN问题排查
问题原因及解决方法
问题根源
你用了链式索引(bars.loc[symbol]['close']),这种方式返回的是原DataFrame的副本而非视图。当你给副本赋值pct_change()的结果时,原DataFrame的returns列根本没被修改,最终自然全是NaN。
正确写法
方法1:修正索引方式,直接操作原DataFrame视图
把链式索引改成一次定位目标位置,确保修改的是原DataFrame:
bars.loc[symbol, 'returns'] = bars.loc[symbol, 'close'].pct_change()
核心是将bars.loc[symbol]['close']替换为bars.loc[symbol, 'close'],避免生成副本。
方法2:不用循环,用groupby批量处理(更高效)
多索引场景下,直接按symbol分组计算百分比变化,无需手动循环,代码更简洁且性能更优:
bars['returns'] = bars.groupby(level='symbol')['close'].pct_change()
如果你的多索引第一层不是symbol,把level参数换成对应的索引名称或位置即可。
内容的提问来源于stack exchange,提问作者Sunday Okpokor
相关产品推荐
相关产品推荐

