Pandas设置多层索引DataFrame值时出现NaN的问题求助
解决Pandas多层索引DataFrame赋值后出现NaN的问题
问题原因
你的代码出现NaN的核心原因是Pandas的索引对齐机制:
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)。- 赋值时你用
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
相关产品推荐
相关产品推荐

