将Pandas DataFrame转换成分层列/改变列层次结构

4
我想要像这样对数据框进行透视:

       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

将数据转换成类似于分层列的数据框格式:
              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

如何更改列的层次结构?
4个回答

4
我自己想出了解决方法:
df = df.swaplevel(0,1,axis = 1).sort(axis = 1)

will do


1
作为一个附注,swaplevel 适用于在两个级别之间进行交换,而 reorder_levels 可以一次执行多个操作,如果这有帮助的话 :) - Anzel
1
你读懂了我的心思:我正想知道swaplevel和reorder_levels之间的区别是什么 :) - Pat Patterson

3
您需要使用 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

1
如果遇到“'DataFrame' object has no attribute 'sort'”错误,请查看此问题:https://dev59.com/EVcP5IYBdhLWcg3wnLN_ - kristian

0

我已经为这个问题奋斗了很长时间。我的工作要求我处理大型数据透视表,其中有几十个索引和更多的值。最后,最方便的解决方案是:

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.pivot_table(index=['location_id', 'place_name', 'address'], columns='day', values='sum')

0

我想补充一下,之前的回答已经过时了。

df = df.swaplevel(0, 1, axis=1) # Swaps level as desired
df.columns = df.columns.sortlevel(0)[0] # Orders level 0, slices to the cols

您可以在此处找到更多关于该方法的文档:https://pandas.pydata.org/docs/reference/api/pandas.MultiIndex.sortlevel.html。它允许用户直接对pandas.MultiIndex的各个级别进行排序。


此外,我刚刚注意到.sortlevel()在我的情况下会导致一些值的改变。我不知道为什么,但它看起来像是一个 bug。有些情况下,值从整数转换为浮点数,并且以某种方式获得了小数值...非常奇怪。请注意这一点。 - MrChadMWood
通过将.swaplevel(0, 1, axis=1)移动到我操作列顺序的行中,解决了上述问题。仍然不确定为什么一开始会出现问题。 - MrChadMWood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接