如何将含多级列的Pandas DataFrame调整为扁平化结构
解决Pandas多级列DataFrame扁平化并保留原始顺序的问题
核心问题分析
你遇到的问题根源在于df.columns.levels[0]的特性:它会返回去重且排序后的第一层级值,这既导致构建新索引时列宽不匹配,又破坏了原始数组的列顺序。要解决这个问题,必须用get_level_values来获取原始的列层级数据。
解决方案
1. 最简方案:直接去掉symbol标签,保留字段顺序
如果只需要将多级列扁平化,去掉symbol标签,让列名直接为字段名(完全匹配原始数组的列顺序),只需几行代码:
import pandas as pd # 假设df是你的多级列DataFrame df_flat = df.copy() # 用get_level_values(1)获取原始顺序的字段名,替换列名 df_flat.columns = df.columns.get_level_values(1)
这样处理后,df_flat的列就是原始数组中按symbol分组的字段顺序(比如[field1, field2, field1, field2]),序列化到JSON或Excel时结构和原始数组完全一致。
2. 进阶方案:生成两行表头(含date索引)
如果需要让date索引成为表头的第二行(比如适配Excel的表头格式),可以重置索引并构建新的多级表头:
# 复制原数据,避免修改原DataFrame df_flat = df.copy() # 获取原始顺序的字段列表(第二层级) fields = df.columns.get_level_values(1) # 构建新的多级表头:第一行留空(去掉symbol标签),第二行是字段名 new_header = pd.MultiIndex.from_tuples( [("", field) for field in fields], names=["", "field"] ) # 替换表头,并将date索引转为列(放到表头第二行对应位置) df_flat.columns = new_header df_flat = df_flat.reset_index()
关键注意点
- 别用
levels,用get_level_values:levels返回的是去重排序后的层级集合,而get_level_values会返回每个列对应的原始层级值(保留重复和原顺序),这是解决列宽不匹配和顺序混乱的核心。 - 保留原数组结构:上述两种方案都严格遵循原始数组的列顺序,不会因为排序导致数据错位。
内容的提问来源于stack exchange,提问作者mike01010
相关产品推荐
相关产品推荐

