如何在Pandas中将多级索引DataFrame转换为行索引重复的单索引DataFrame?
解决Pandas宽表转长表(多级索引转单索引)的问题
这在Pandas里其实是很常见的宽表转长表操作,有两种简单直观的方法可以实现,我给你一步步演示:
1. 先构造示例数据
首先我们先还原你给出的两级索引DataFrame,方便后续测试:
import pandas as pd data = { 1: [2, 1, 0], 2: [4, 3, 0], 3: [6, 5, 0], 4: [8, 7, 0], 5: [10, 9, 0] } # 把Time设为行索引 df = pd.DataFrame(data, index=pd.Index([0, 1, 2], name='Time'))
2. 方法一:使用melt()(推荐,语义清晰)
melt()是Pandas专门为宽转长设计的方法,参数设置非常直观:
# 先把行索引Time转为普通列,再执行melt转换 long_df = df.reset_index().melt( id_vars='Time', # 指定保留作为标识的列(每个Time会重复对应所有Location) var_name='Location', # 原列名(Location编号)对应的新列名称 value_name='Value' # 原单元格数值对应的新列名称 )
3. 方法二:使用stack()(适合熟悉索引操作的场景)
stack()会把列索引转为行索引的一部分,形成多级索引,再重置索引即可:
# stack将列转为内层行索引,得到多级索引Series,再重置索引为列 long_df = df.stack().reset_index() # 重命名列名匹配需求 long_df.columns = ['Time', 'Location', 'Value']
最终转换结果
两种方法都会得到你需要的单索引DataFrame:
Time Location Value 0 0 1 2 1 0 2 4 2 0 3 6 3 0 4 8 4 0 5 10 5 1 1 1 6 1 2 3 7 1 3 5 8 1 4 7 9 1 5 9 10 2 1 0 11 2 2 0 12 2 3 0 13 2 4 0 14 2 5 0
内容的提问来源于stack exchange,提问作者HighVoltage
相关产品推荐
相关产品推荐

