You need to enable JavaScript to run this app. 如何将多重索引pandas Series转为以experienceGroup为列的全填充DataFrame
优惠活动
大模型
产品
解决方案
定价
更多

如何将多重索引pandas Series转为以experienceGroup为列的全填充DataFrame

问题根因

直接对三重索引的计数Series执行unstack()会默认将最内层的experienceGroup转为列,但外层的target、last_new_job会保留为多级行索引,且未出现的组值交叉位默认填充NaN,无法满足「两字段独立为普通列、所有计数列全值填充」的结构要求。

可复现的转换实现步骤

1. 前置准备

先导入依赖、复现测试数据集、生成目标三重索引Series:

import pandas as pd

details = {
    "experienceGroup": ['0-5','6-12','13-19','20 & above','0-5','6-12','13-19','20 & above'],
    "last_new_job": [1, '>4', 2, "never", 4, 3, 3, 4],
    "target": [1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0],
    "experience": [1, 7, 15, 20, 3, 8, 17, 25]
}
df5 = pd.DataFrame(details)

# 生成三重索引的计数值Series(索引层级为 target > last_new_job > experienceGroup)
Job = df5.groupby(['target','last_new_job'])['experienceGroup'].value_counts()

2. 核心转换操作

# 展开experienceGroup为列 → 重置行索引释放target、last_new_job为普通列 → 填充空值
result = Job.unstack(level=-1).reset_index().fillna(0)

每一步的作用:

  • unstack(level=-1):固定展开索引最内层的experienceGroup,将所有枚举值转为DataFrame列名,匹配列名要求
  • reset_index():把原本作为多级行索引的target、last_new_job从索引维度拉出,成为独立的普通数据列,不再依附行索引存在
  • fillna(0):把无对应样本的交叉组合位置的空值替换为0,实现所有列的完整填充

3. 可选优化

  • 由于填充空值后计数列会自动转为浮点型,可将计数列转回整数类型,匹配计数的数值语义:
    dim_cols = ['target', 'last_new_job']
    count_columns = [col for col in result.columns if col not in dim_cols]
    result[count_columns] = result[count_columns].astype(int)
    
  • 可按业务习惯固定experienceGroup的列展示顺序,避免默认字符串排序带来的顺序混乱:
    desired_exp_group_order = ['0-5', '6-12', '13-19', '20 & above']
    result = result[dim_cols + desired_exp_group_order]
    
最终输出结构

转换完成后的DataFrame结构为:

  • 独立维度列:target、last_new_job
  • 计数列:所有experienceGroup的枚举值
  • 所有交叉组合位置无空值,缺失计数位自动填充为0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 14:06:06