基于已有DataFrame和DatetimeIndex创建新表出现列值为NaN问题问询
全NaN值的产生原因
核心原因是Pandas的索引自动对齐机制:
- 你传入
pd.DataFrame()构造函数的第一个参数df1["Prod"]是一个Series对象,它自带原始的整数索引:[0, 1] - 你额外指定的新索引是生成的DatetimeIndex:
["2021-05-01 15:05:01", "2021-05-01 15:05:05"] - Pandas构建DataFrame时,会自动将输入Series的索引和新指定的索引做值匹配,两组索引完全没有重叠项,所以匹配结果全部为NaN。
你转为列表后能得到正确结果的原因是:列表属于没有索引的纯值序列,Pandas不会触发索引对齐逻辑,会直接按位置将列表值和新索引一一对应,因此数值填充正常。
无报错的原因
这是Pandas的刻意设计:索引对齐是Pandas的核心特性之一,设计初衷就是为了兼容不同索引的数据集合并、拼接场景,索引不匹配时默认填充NaN而不是抛出错误,给用户更大的灵活性处理异构数据。
更简洁的解决方案
不需要将数据转为列表,更符合Pandas语法习惯的写法如下:
# 方案1:直接基于原DataFrame设置索引 df2 = df1.set_index(pd.DatetimeIndex(df1["DT"]))[["Prod"]] # 方案2:提取Prod列后直接替换索引再转DataFrame df2 = df1["Prod"].set_axis(pd.DatetimeIndex(df1["DT"])).to_frame()
内容的提问来源于stack exchange,提问作者ThomasAJ
相关产品推荐
相关产品推荐

