修复Pandas DataFrame二级列排序问题及非透视表实现方案
问题解决:保持二级列顺序的DataFrame重塑
一、修复pivot_table方案
使用pivot_table时默认会自动排序列,导致原始列顺序被打乱,可通过以下步骤修复:
- 在
pivot_table中设置sort=False,禁止自动排序列 - 显式指定二级列的目标顺序,匹配原始DataFrame的列序列
示例代码:
# 假设分组列为'Device',行索引为'Timestamp' pivoted = df.pivot_table( index='Timestamp', columns='Device', values=['HV Current', 'Total Power', 'Tap Pos.'], sort=False # 关键参数:保留values传入的原始列顺序 ) # 交换列层级(若需将Device设为一级列、指标设为二级列) pivoted = pivoted.swaplevel(axis=1) # 强制指定二级列顺序 desired_order = ['HV Current', 'Total Power', 'Tap Pos.'] pivoted = pivoted.reindex(columns=pivoted.columns.unique(level=0), level=0) pivoted = pivoted.reindex(columns=desired_order, level=1)
二、非透视表实现方式
方法1:groupby + unstack
# 按Timestamp和Device分组,严格保留原始列顺序 grouped = df.groupby(['Timestamp', 'Device'])[['HV Current', 'Total Power', 'Tap Pos.']].first() # 将Device从索引转为列,生成二级列结构 result = grouped.unstack(level='Device') # 交换列层级(按需选择) result = result.swaplevel(axis=1) # 确保二级列顺序符合要求 desired_order = ['HV Current', 'Total Power', 'Tap Pos.'] result = result.reindex(columns=result.columns.unique(level=0), level=0) result = result.reindex(columns=desired_order, level=1)
方法2:手动构造MultiIndex列
适合结构简单的场景,完全手动控制列顺序:
# 提取各设备的子集并设置索引 device_a = df[df['Device'] == 'A'].set_index('Timestamp')[['HV Current', 'Total Power', 'Tap Pos.']] device_b = df[df['Device'] == 'B'].set_index('Timestamp')[['HV Current', 'Total Power', 'Tap Pos.']] # 为每个子集构造MultiIndex列 device_a.columns = pd.MultiIndex.from_product([['A'], device_a.columns]) device_b.columns = pd.MultiIndex.from_product([['B'], device_b.columns]) # 合并结果,原始列顺序完全保留 result = pd.concat([device_a, device_b], axis=1)
内容的提问来源于stack exchange,提问作者rush dee
相关产品推荐
相关产品推荐

