如何在Python中用Pivot函数按CType将USD与EU列并排展示
动态调整Pivot后的数据列顺序(按CType分组并排展示)
现有如下数据构造代码:
from collections import OrderedDict import pandas as pd import numpy as np table = OrderedDict(( ("Item", ['Item0', 'Item0', 'Item1', 'Item1']), ('CType',['Gold', 'Bronze', 'Gold', 'Silver']), ('USD', ['1$', '2$', '3$', '4$']), ('EU', ['1€', '2€', '3€', '4€']) )) d = pd.DataFrame(table)
生成的初始表格:
| Item | CType | USD | EU | |
|---|---|---|---|---|
| 0 | Item0 | Gold | 1$ | 1€ |
| 1 | Item0 | Bronze | 2$ | 2€ |
| 2 | Item1 | Gold | 3$ | 3€ |
| 3 | Item1 | Silver | 4$ | 4€ |
使用常规pivot代码后:
p = d.pivot(index='Item', columns='CType') p.columns = p.columns.map('.'.join) p = p.reset_index()
得到的列顺序是按原指标(USD/EU)分组,而非按CType分组:
| Item | USD.Bronze | USD.Gold | USD.Silver | EU.Bronze | EU.Gold | EU.Silver | |
|---|---|---|---|---|---|---|---|
| 0 | Item0 | 2$ | 1$ | NaN | 2€ | 1€ | NaN |
| 1 | Item1 | NaN | 3$ | 4$ | NaN | 3€ | 4€ |
需求是每个CType对应的USD和EU列并排展示,且CType数量可能动态变化,无法手动指定列顺序,期望结果如下:
| Item | USD.Bronze | EU.Bronze | USD.Gold | EU.Gold | USD.Silver | EU.Silver | |
|---|---|---|---|---|---|---|---|
| 0 | Item0 | 2$ | 2€ | 1$ | 1€ | NaN | NaN |
| 1 | Item1 | NaN | NaN | 3$ | 3€ | 4$ | 4€ |
实现方法
核心思路是利用pivot生成的多级列索引(MultiIndex),先调整层级顺序再排序,最后合并列名,无需手动指定列:
# 执行pivot,保留多级列索引 p = d.pivot(index='Item', columns='CType') # 交换列的层级:将原第二层级(CType)移到第一层级,原第一层级(USD/EU)移到第二层级 p = p.swaplevel(axis='columns') # 按列索引排序,确保每个CType下的USD、EU连续排列 p = p.sort_index(axis='columns') # 合并多级列索引为字符串格式 p.columns = p.columns.map('.'.join) # 重置索引,将Item从索引转为列 p = p.reset_index()
运行后即可得到期望的列顺序,无论CType新增或减少,代码都能自动适配。
关键步骤解释
swaplevel(axis='columns'):交换多级列索引的层级,把CType放到最外层,这样排序时会先按CType分组sort_index(axis='columns'):对列索引排序,同一CType下的USD和EU会自然排列在一起- 最后合并列名并重置索引,完成格式转换
内容的提问来源于stack exchange,提问作者Vinod Thorat
相关产品推荐
相关产品推荐

