如何将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()方法就能轻松解决这个问题。
解决方案步骤:
- 用
stack()将列的number层级转为行索引:stack(level='number')会把指定层级的列转成行的一部分索引,这一步会自动把A、B列的one/two值拆成单独的行,同时C列因为没有对应的number层级值,会自动填充到每个对应的行中。 - 重置索引,把
number转成普通列:
用reset_index()把行索引中的number提取为单独的列,同时丢弃原来的行索引。 - 调整列顺序并排序:
按照你想要的输出顺序调整列的位置,再按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
相关产品推荐
相关产品推荐

