为Excel导入的Pandas DataFrame添加多层列头后所有值变为NaN如何解决
问题原因
你在创建新DataFrame时传入了已有的DataFrame对象a,pandas的pd.DataFrame()构造逻辑会自动对齐原DataFrame的列名与你传入的columns参数的列名。由于a本身是单层列名的DataFrame,你传入的新列名是多层层级结构,二者完全无法匹配,因此所有位置都填充为NaN。
而你直接传入NumPy数组时,数组本身没有列名属性,pandas不会执行列名对齐操作,会直接按顺序把数组值填入新的列结构中,因此可以正常运行。
解决方案
提供两种常用的可直接运行的修复方案:
- 方案1:直接修改原DataFrame的列属性,无需重新构造对象,性能更好
arrays = [["KRW","KRW", "MYR","MYR"],["Date", "Price","Date", "Price"]] # 直接给选中的DataFrame设置多层列索引,无需额外构造步骤 a.columns = pd.MultiIndex.from_arrays(arrays) # 如果需要保留原a不被修改,可先拷贝再修改 bb = a.copy() bb.columns = pd.MultiIndex.from_arrays(arrays)
- 方案2:构造新DataFrame时传入原DataFrame的底层NumPy数组,跳过列名对齐逻辑
arrays = [["KRW","KRW", "MYR","MYR"],["Date", "Price","Date", "Price"]] bb = pd.DataFrame(a.values, columns=pd.MultiIndex.from_arrays(arrays))
额外优化提示:你原有代码中生成MultiIndex时手动转元组列表的步骤可以省略,直接调用
pd.MultiIndex.from_arrays(arrays)即可得到完全相同的结果,代码更简洁。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

