向无NaN的pd.Series添加至pd.DataFrame后出现NaN问题求助
问题原因
核心原因是DataFrame与Series的索引标签不匹配。Pandas在添加列时,默认会按索引标签对齐数据,而非简单按行的位置顺序匹配。哪怕两者长度完全一致,只要索引标签无法一一对应,对应不上的行就会被填充为NaN。
举个典型的示例:
import pandas as pd # 构造索引标签不匹配的DataFrame和Series df = pd.DataFrame({'原列': [10, 20, 30]}, index=[2, 3, 4]) s = pd.Series([40, 50, 60], index=[0, 1, 2]) # 直接添加列会出现NaN df['新增列'] = s print(df) # 输出结果: # 原列 新增列 # 2 10 60.0 # 3 20 NaN # 4 30 NaN
解决方法
以下几种方案可以确保无NaN添加新列:
方案1:忽略索引,按位置直接赋值
提取Series的底层值数组,绕过索引对齐逻辑,直接按行位置赋值:
df['新增列'] = s.values # 或者用assign方法链式操作 df = df.assign(新增列=s.values)
方案2:重置两者的索引为默认整数序列
将DataFrame和Series的索引都重置为从0开始的连续整数,消除索引标签不匹配的问题:
# 重置索引,drop=True避免原索引被保留为新列 df = df.reset_index(drop=True) s = s.reset_index(drop=True) df['新增列'] = s
方案3:使用pd.concat按列合并(强制位置对齐)
通过pd.concat合并时,先重置两者索引再按列合并,确保行位置完全对应:
# 先给Series命名,避免合并后列名是默认的0 s = s.rename('新增列') df = pd.concat([df.reset_index(drop=True), s.reset_index(drop=True)], axis=1)
内容的提问来源于stack exchange,提问作者Kilaru Vasudeva
相关产品推荐
相关产品推荐

