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

如何将Pandas DataFrame的多级列索引转换为单列(将number层级转为列)

如何将Pandas DataFrame的多级列索引转换为单列(将number层级转为列)

看起来你想要把多级列索引中的number层级提取出来作为单独的一列,同时把原来的A、B列按number的不同值拆成行,C列保留对应原始行的值对吧?我来帮你搞定这个问题。

首先先复现你的原始数据构造:

import pandas as pd

columns = pd.MultiIndex.from_tuples(
    [('A', 'one'), ('A', 'two'), ('B', 'one'), ('B', 'two'), ('C', '')],
    names=[None, 'number'])

df = pd.DataFrame([[1, 2, 3, 4, 'X'], [5, 6, 7, 8, 'Y']], columns=columns)

原始的DataFrame长这样:

A       B      C
number one two one two   
0        1   2   3   4  X
1        5   6   7   8  Y

你之前尝试的df[[('number', ('A','one')]]索引方式是不对的,因为number是列索引的层级名称,不是索引值本身,多级列的正确访问方式应该是像df[('A', 'one')]这样直接指定层级值的元组。不过其实我们不需要手动提取,用Pandas的stack()方法就能轻松解决这个问题。

解决方案步骤:

  1. 用stack()将列的number层级转为行索引:
    stack(level='number')会把指定层级的列转成行的一部分索引,这一步会自动把A、B列的one/two值拆成单独的行,同时C列因为没有对应的number层级值,会自动填充到每个对应的行中。
  2. 重置索引,把number转成普通列:
    用reset_index()把行索引中的number提取为单独的列,同时丢弃原来的行索引。
  3. 调整列顺序并排序:
    按照你想要的输出顺序调整列的位置,再按number排序,就能得到目标格式。

完整代码如下:

# 将number层级转为行索引
stacked_df = df.stack(level='number')
# 重置索引,提取number为列,并丢弃原行索引
result_df = stacked_df.reset_index(level='number').reset_index(drop=True)
# 调整列的顺序,把number放到最后
result_df = result_df[['A', 'B', 'C', 'number']]
# 按number排序,得到你想要的顺序
result_df = result_df.sort_values('number').reset_index(drop=True)

print(result_df)

运行后输出就是你想要的格式:

A  B  C number
0  1  3  X    one
1  5  7  Y    one
2  2  4  X    two
3  6  8  Y    two

这样就完美实现了你的需求啦!

备注:内容来源于stack exchange,提问作者HappyPy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:19:29