基于旧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
相关产品推荐
相关产品推荐

