在pandas DataFrame中一次重新排序多个列级别

yi0zb3m4  于 2023-04-28  发布在  其他
关注(0)|答案(1)|浏览(95)

我试图创建一个报告使用Pandas透视表,目前我有下面的代码与此输出

df = pd.pivot_table(raw, values=['Shipped','Sold'], index=['Category', 'Model No'], columns=['Customer', 'Week Start Date'], aggfunc=np.sum, fill_value=0)

输出

但是我想要的输出是下面的

怎么样才能像第二份报告呢?
谢谢!

zed5wv10

zed5wv101#

使用MultiIndex.reorder_levels,然后使用sort_indexaxis=1对列轴进行排序:

df.columns = df.columns.reorder_levels((1, 2, 0))
df = df.sort_index(axis=1)

示例:

np.random.seed(42)
columns = pd.MultiIndex.from_product(
   [['Shipped', 'Sold'], ['A', 'B'], ['d1', 'd2']])
data = np.random.randint(0, 100, size=(5, 8))
df = pd.DataFrame(data, columns=columns)

df   
  Shipped             Sold                # level 0    
        A       B        A       B        # level 1
       d1  d2  d1  d2   d1  d2  d1  d2    # level 2
0      51  92  14  71   60  20  82  86
1      74  74  87  99   23   2  21  52
2       1  87  29  37    1  63  59  20
3      32  75  57  21   88  48  90  58
4      41  91  59  79   14  61  61  46
# 1st level now 0th, 2nd level now 1st, 0th level now last
df.columns = df.columns.reorder_levels((1, 2, 0))
df = df.sort_index(axis=1)
df
        A                         B                  
       d1           d2           d1           d2     
  Shipped Sold Shipped Sold Shipped Sold Shipped Sold
0      51   60      92   20      14   82      71   86
1      74   23      74    2      87   21      99   52
2       1    1      87   63      29   59      37   20
3      32   88      75   48      57   90      21   58
4      41   14      91   61      59   61      79   46

为了方便后人,我还将在评论中使用stack加上unstack来包含Quang Hoang的选项:

df.stack(0).unstack(-1)

        A                         B                  
       d1           d2           d1           d2     
  Shipped Sold Shipped Sold Shipped Sold Shipped Sold
0      51   60      92   20      14   82      71   86
1      74   23      74    2      87   21      99   52
2       1    1      87   63      29   59      37   20
3      32   88      75   48      57   90      21   58
4      41   14      91   61      59   61      79   46

不过请注意,这通常不是一个性能非常好的选项,因为它实际上必须重新塑造您的DataFrame。

相关问题