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

Pandas设置多层索引DataFrame值时出现NaN的问题求助

解决Pandas多层索引DataFrame赋值后出现NaN的问题

问题原因

你的代码出现NaN的核心原因是Pandas的索引对齐机制:

  1. groupby(["a","b","c"])执行后,df的多层索引是原数据中a/b/c列的唯一值组合(即(0,1,2)、(10,11,12)、(20,21,22)),df2的索引则是(100,101,102)、(110,111,112)、(120,121,122)。
  2. 赋值时你用df2.loc[slice(100,100),slice(101,101),slice(102,102), :]获取的是带有(100,101,102)索引的DataFrame,Pandas会自动尝试对齐索引——但df中不存在这个索引,因此无法完成赋值,最终目标行被覆盖为NaN。

另外,slice(0,0),slice(1,1),slice(2,2)的切片写法虽然能定位到df的目标行,但不如直接用元组精确匹配索引直观。

可行解决办法

办法一:提取纯数值数组赋值(推荐)

直接用元组匹配目标索引,同时提取df2对应行的纯数值(跳过索引对齐),即可完成正确赋值:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(0,30,1).reshape(3,10))
df2 = pd.DataFrame(np.arange(100,130,1).reshape(3,10))

df.columns = list("abcdefghij")
df2.columns = list("abcdefghij")
df = df.groupby(["a", "b", "c"]).agg("sum")
df2 = df2.groupby(["a", "b", "c"]).agg("sum")

# 用元组精确匹配多层索引,提取values避免索引对齐问题
df.loc[(0, 1, 2), :] = df2.loc[(100, 101, 102), :].values
print(df)

办法二:重置索引后赋值(适合复杂条件匹配)

如果需要更灵活的行匹配逻辑,可以先把多层索引转为普通列,赋值后再恢复索引:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(0,30,1).reshape(3,10))
df2 = pd.DataFrame(np.arange(100,130,1).reshape(3,10))

df.columns = list("abcdefghij")
df2.columns = list("abcdefghij")
df = df.groupby(["a", "b", "c"]).agg("sum")
df2 = df2.groupby(["a", "b", "c"]).agg("sum")

# 重置索引为普通列
df_reset = df.reset_index()
df2_reset = df2.reset_index()

# 定位目标行并赋值
target_row_idx = df_reset[(df_reset["a"] == 0) & (df_reset["b"] == 1) & (df_reset["c"] == 2)].index[0]
source_vals = df2_reset[(df2_reset["a"] == 100) & (df2_reset["b"] == 101) & (df2_reset["c"] == 102)].iloc[0, 3:]
df_reset.loc[target_row_idx, "d":"j"] = source_vals

# 恢复多层索引
df = df_reset.set_index(["a", "b", "c"])
print(df)

内容的提问来源于stack exchange,提问作者Robin to Roxel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:40:36