使用普通DataFrame为多层列DataFrame赋值时出现NaN值的问题咨询
问题原因与解决方案
这不是预期行为,问题出在两个DataFrame的列结构不匹配,导致pandas无法正确对齐列名完成赋值。
为什么会出现NaN?
你的df是多层列(MultiIndex)结构,目标切片df.loc[:, (slice(None), "mean")]对应的列是("old", "mean")和("new", "mean");而temp的列是单层的"old"和"new"。当你直接赋值时,pandas会尝试严格对齐列名——单层列名和多层元组列名无法匹配,所以赋值失败,最终填充了NaN。
解决方法
这里有几种靠谱的解决方式,你可以根据场景选择:
1. 将temp的列转换为多层结构(推荐)
把temp的列改成和df目标切片一致的多层元组,让pandas能完美对齐:
import pandas as pd df = pd.DataFrame.from_dict( { ("old", "mean"): {"high": 0.0, "med": 0.0, "low": 0.0}, ("old", "std"): {"high": 0.0, "med": 0.0, "low": 0.0}, ("new", "mean"): {"high": 0.0, "med": 0.0, "low": 0.0}, ("new", "std"): {"high": 0.0, "med": 0.0, "low": 0.0}, } ) temp = pd.DataFrame.from_dict( { "old": { "high": 2.6798302797288174, "med": 10.546654056177656, "low": 16.46382603916123, }, "new": { "high": 15.91881231611413, "med": 16.671967271277495, "low": 26.17872356316402, }, } ) # 修改temp的列结构为多层 temp.columns = pd.MultiIndex.from_tuples([(col, "mean") for col in temp.columns]) df.loc[:, (slice(None), "mean")] = temp print(df)
运行后会得到正确结果:
old new mean std mean std high 2.680 0.0 15.918812 0.0 med 10.547 0.0 16.671967 0.0 low 16.464 0.0 26.178724 0.0
2. 逐个列赋值
如果不想修改temp的结构,可以直接遍历temp的列,对应到df的多层列赋值:
for col_name in temp.columns: df[(col_name, "mean")] = temp[col_name]
3. 使用update()方法
update()方法会直接匹配索引和列名更新,只需先给temp的列加上对应层级后缀:
df.update(temp.rename(columns=lambda x: (x, "mean")))
总结
pandas的赋值操作非常依赖索引和列名的精确对齐,当左右两边列结构(单层/多层)不一致时,就会出现匹配失败的情况。只要让两边列名结构保持一致,就能顺利完成赋值。
内容的提问来源于stack exchange,提问作者gnikit
相关产品推荐
相关产品推荐

