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

修复Pandas DataFrame二级列排序问题及非透视表实现方案

问题解决:保持二级列顺序的DataFrame重塑

一、修复pivot_table方案

使用pivot_table时默认会自动排序列,导致原始列顺序被打乱,可通过以下步骤修复:

  1. 在pivot_table中设置sort=False,禁止自动排序列
  2. 显式指定二级列的目标顺序,匹配原始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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:14:54