You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用普通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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 04:57:35