Pandas向DataFrame列赋值时出现NaN异常问题求助
Pandas赋值列出现NaN的原因与解决办法
核心原因:索引对齐机制
这是Pandas的索引对齐特性导致的问题:
- 当你创建空DataFrame时,它没有任何索引信息。第一次给某列赋值时,Pandas会自动把源数据的索引同步到新DataFrame中。
- 第二次赋值另一列时,如果源数据的索引和新DataFrame的索引无法完全匹配(比如你筛选后的源数据保留了原DataFrame的非连续索引),Pandas会按照索引去匹配行,找不到对应索引的位置就填充
NaN。调换赋值顺序时,第一次赋值的列会同步自己的索引,第二次的列因为索引不匹配就变成NaN,所以出现相反的结果。 - 你说重置索引没用?大概率是重置时没加
drop=True,旧索引变成了普通列,新的索引还是没和空DataFrame对齐。
解决方法
方法1:一次性构造新DataFrame(最推荐)
直接把需要的列一次性传入pd.DataFrame,避免分步赋值的索引问题:
# filtered_df是你筛选后的目标DataFrame new_df = pd.DataFrame({ 'contractions': filtered_df['contractions'], 'followup': filtered_df['followup'] })
方法2:先创建带匹配索引的空DataFrame
先基于筛选后的数据索引初始化空DataFrame,再依次赋值:
new_df = pd.DataFrame(index=filtered_df.index) new_df['contractions'] = filtered_df['contractions'] new_df['followup'] = filtered_df['followup']
方法3:绕开索引对齐,直接赋值底层数据
用.values或.to_numpy()获取数据的底层数组,跳过Pandas的索引对齐逻辑:
new_df = pd.DataFrame() new_df['contractions'] = filtered_df['contractions'].values new_df['followup'] = filtered_df['followup'].values
内容的提问来源于stack exchange,提问作者Vartez652
相关产品推荐
相关产品推荐

