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

pandas拆分列生成多级索引出现nan列名的解决方法

问题根源

执行df.columns.str.split('/', expand=True)后出现NaN,是因为不同列名按/拆分后的段数不一致:比如A/service1/service2/200拆分后为4段,D/service1/service2/500/std拆分后为5段,pandas生成多级索引时会自动给短列的缺失层级补NaN,这类NaN是索引层级值而非独立列,常规的列重命名、删除操作无法直接生效。

可选解决方案

方案1:跳过列索引拆分步骤,直接生成嵌套字典(最简便)

既然最终目标是转回嵌套字典,完全不需要先拆分生成多级列索引,直接遍历原始扁平化列名按分隔符拆分,逐层构建字典结构即可,从根源避免NaN问题:

def flat_cols_to_nested_dict(df, sep='/'):
    nested_result = {}
    for col in df.columns:
        key_chain = col.split(sep)
        current_level = nested_result
        # 逐层创建父级字典
        for k in key_chain[:-1]:
            current_level = current_level.setdefault(k, {})
        # 写入最末层的列值,可根据需求调整值格式,比如转标量、保留Series等
        current_level[key_chain[-1]] = df[col].tolist()
    return nested_result

# 直接调用即可得到目标嵌套字典
final_dict = flat_cols_to_nested_dict(df)

方案2:先修复多级索引的NaN,再转字典

如果需要保留多级列索引做中间数据处理,可以先填充索引里的NaN,再执行字典转换:

  1. 拆分列名并填充NaN值
# 拆分生成多级列索引
df.columns = df.columns.str.split('/', expand=True)
# 用空字符串填充所有层级的NaN值,也可替换为自定义占位名
for level_idx in range(df.columns.nlevels):
    df.columns = df.columns.set_levels(
        df.columns.levels[level_idx].fillna(''),
        level=level_idx
    )
  1. 按需过滤不需要的列(比如最末层级为空的列)
# 过滤掉最后一级为空的列
df = df.loc[:, df.columns.get_level_values(-1) != '']
  1. 基于多级列索引生成嵌套字典
def multiindex_df_to_nested_dict(df):
    res = {}
    for col_tuple, col_values in df.items():
        current = res
        for k in col_tuple[:-1]:
            current = current.setdefault(k, {})
        current[col_tuple[-1]] = col_values.tolist()
    return res

final_dict = multiindex_df_to_nested_dict(df)

内容的提问来源于stack exchange,提问作者sherin_a27

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:09:09