将Pandas DataFrame透视到分层列中/更改列层次结构

bybem2ql  于 2023-02-06  发布在  其他
关注(0)|答案(3)|浏览(118)

我想透视一个 Dataframe ,如下所示:

dim1   Value_V     Value_y   instance
0      A_1     50.000000        0   instance200
1      A_2   6500.000000        1   instance200
2      A_3     50.000000        0   instance200
3      A_4   4305.922313        1   instance200

转换成具有如下层次结构列的 Dataframe :

A_1               A_2               A_3                .....
              Value_V  Value_y  Value_V  Value_y  Value_V  Value_y
instance200   50       0        6500     1        50       0

我试过df = df.pivot(index = "instance", columns = "dim1"),但它只会给予我一个这样的框架:

Value_V               Value_y                              
              A_1   A_2   A_3 ....  A_1  A_2  A_3 ....
instance200   50    6500  50        0    1    0

如何更改列的层次结构?

70gysomp

70gysomp1#

我自己想出来的:

df = df.swaplevel(0,1,axis = 1).sort(axis = 1)

我愿意

disbfnqx

disbfnqx2#

您需要的是reorder_levels,然后对列进行排序,如下所示:

import pandas as pd

df = pd.read_clipboard()

df
Out[8]:
dim1    Value_V Value_y instance
0   A_1 50.000000   0   instance200
1   A_2 6500.000000 1   instance200
2   A_3 50.000000   0   instance200
3   A_4 4305.922313 1   instance200
In [9]:

df.pivot('instance', 'dim1').reorder_levels([1, 0], axis=1).sort(axis=1)
Out[9]:
dim1        A_1             A_2             A_3             A_4
            Value_V Value_y Value_V Value_y Value_V Value_y Value_V Value_y
instance                                
instance200 50      0       6500    1       50      0       4305.922313 1
ubof19bj

ubof19bj3#

我已经和这个问题斗争了很长时间。我的工作要求我处理大型的pivot_tables,其中有几十个索引和更多的值。最后,就通用性而言,最方便的解决方案是:

def pivot_fix(df):
    df = (df.reset_index().T.reset_index(level=0).T.reset_index(drop=True).
          reset_index(drop=True).reset_index(drop=True).T.reset_index().T)
    df.iloc[0, :df.iloc[0, :].isna().sum()] = df.iloc[1, :df.iloc[0, :].isna().sum()]
    df.columns = df.iloc[0]
    df.drop(df.index[0:2], inplace=True)
    return(df)

像这样使用它:df =(df.透视表(索引=[“位置标识”,“地点名称”,“地址”],列=“日期”,值=“总和”)

相关问题