Pandas DataFrame初始化指定columns填充NaN单独赋值列名正常的原因
差异产生的根本原因
两种写法结果不同,本质是Pandas对「构造时传入columns参数」和「构造后修改df.columns属性」的执行逻辑完全不一样:
- 构造DataFrame时传入
columns参数,会触发Pandas默认的标签对齐机制:框架会拿你传入的列名列表,和输入数据(此处是列表里包裹的单个pd.Series)的索引标签做精确匹配,只有标签完全对应上的位置才会填入真实值,匹配失败的位置统一填充NaN。
你代码里直接用pd.Series(data)生成的序列没有自定义索引,默认索引是从0开始的整数:[0,1,2,3,4,5],和你传入的字符串列名['aaa', 'aaa.1', 'aaab', 'aaac', 'aaac.1', 'aaac.2']没有任何匹配项,自然所有列都会被填成NaN。 - 先不传
columns完成DataFrame初始化,再给df.columns赋值,本质是直接重命名已有列:这一步不会触发任何标签匹配、值校验的逻辑,只是把DataFrame已经生成的默认列名(也就是序列自带的0-5整数索引)替换成你传入的新名称,单元格里存储的原有数据不会做任何改动,所以能得到符合预期的结果。
验证方法
如果要在构造阶段直接传columns得到正确结果,只需要提前给Series设置和列名一致的索引,让标签能匹配上即可:
import pandas as pd col_headers = ['aaa', 'aaa.1', 'aaab', 'aaac', 'aaac.1', 'aaac.2'] data = ['aaa', 'aaa', 'aaab', 'aaac', 'aaac', 'aaac'] # 给Series指定和columns一致的索引 s = pd.Series(data, index=col_headers) df = pd.DataFrame(data=[s], columns=col_headers, dtype=object)
运行上述代码会得到和先初始化再改列名完全一致的正常结果,没有NaN值。
注:标签对齐是Pandas的核心设计逻辑,除了DataFrame初始化,在表拼接、合并、按索引赋值等场景下,默认都是按标签匹配而非按位置匹配,是高频踩坑点。
内容的提问来源于stack exchange,提问作者Suprateem Banerjee
相关产品推荐
相关产品推荐

