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

基于旧DataFrame创建新特征DataFrame时生成全NaN值的原因咨询

问题原因分析与解决方案

这个问题的核心原因是pandas赋值时的索引对齐机制,我们一步步拆解问题所在:

1. 索引不匹配的根源

  • 首先看你的df1:它的索引是pandas默认生成的整数索引[0,1,2],datetime只是其中一列,存储日期字符串。
  • 你创建features时,用index=df1.datetime把日期字符串设为了features的索引,此时features的索引是['2020-1-1', '2020-1-2', '2020-1-3']。
  • 当你执行features['daily_change'] = df1.price_close/df1.price_open-1时,右边的计算结果是一个Series,它的索引继承自df1的整数索引[0,1,2]。

pandas在赋值时会严格按照索引对齐:只有两边索引完全匹配的位置才会赋值,否则填充NaN。因为features的索引是日期,而右边Series的索引是整数,没有任何匹配项,所以最终features全是NaN。

2. 两种可行的解决方案

方案一:先将df1的datetime设为索引

这种方式最直观,让后续计算的Series索引和features保持一致:

import pandas as pd
import numpy as np

df_msft = [['2020-1-1', 10, 11], ['2020-1-2', 15, 20], ['2020-1-3', 14, 12]]
df1 = pd.DataFrame(df_msft , columns = ['datetime', 'price_open', 'price_close'])

# 把datetime设为df1的索引
df1.set_index('datetime', inplace=True)
# 基于df1的索引创建features
features = pd.DataFrame(index=df1.index).sort_index()

features['daily_change'] = df1.price_close/df1.price_open-1
features['pct_change_on_day'] = df1.price_open/df1.price_close.shift(1)-1

方案二:手动对齐计算结果的索引

如果不想修改原df1的结构,可以把计算结果的索引设置为df1.datetime,强制对齐:

import pandas as pd
import numpy as np

df_msft = [['2020-1-1', 10, 11], ['2020-1-2', 15, 20], ['2020-1-3', 14, 12]]
df1 = pd.DataFrame(df_msft , columns = ['datetime', 'price_open', 'price_close'])

features = pd.DataFrame(index=df1.datetime).sort_index()

# 给计算结果设置和features一致的索引
features['daily_change'] = (df1.price_close/df1.price_open-1).set_axis(df1.datetime)
features['pct_change_on_day'] = (df1.price_open/df1.price_close.shift(1)-1).set_axis(df1.datetime)

执行任意一种方案后,features都会得到正确的计算值,不会再出现全NaN的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:07:40