将Pandas Multi-Index转换为专栏


155

我有一个具有2个索引级别的数据框:

                         value
Trial    measurement
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 

我想变成这样:

Trial    measurement       value

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34 

我怎样才能最好地做到这一点?

我需要这样做是因为我想按照此处的指示汇总数据,但是如果将它们用作索引,则无法选择这样的列。


2
重复:stackoverflow.com/questions/18624039/… 您想要第一个建议。.reset_index()
TomAugspurger

1
非常感谢,我实际上浏览了很多,但是“使多索引转换为列”和类似的查询总是让我感到想要改变数据帧的线程...
TheChymera 2013年

3
当您已经知道答案时,总是总是很容易找到它:)
TomAugspurger

Answers:


192

所述reset_index()是一个数据帧熊猫方法,将索引值转移到数据帧为列。参数的默认设置为drop = False(将索引值保留为列)。

您只需.reset_index(inplace=True)在DataFrame名称后添加:

df.reset_index(inplace=True)  

3
对于我有3个索引级别的情况,就地重置不起作用。另一种方法是将新重置的数据帧分配给一个新的数据帧:df2 = df.reset_index()
Gorkem

8
要仅重置特定级别,请使用df.reset_index(level=[...])
cs95

20

这并不是真的适用于您的情况,但可能有助于其他人(例如5分钟前的我自己)知道。如果一个人的多重数具有如下相同的名称:

                         value
Trial        Trial
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 

df.reset_index(inplace=True) 将会失败,因为创建的列不能具有相同的名称。

因此,您需要将multindex重命名为df.index = df.index.set_names(['Trial', 'measurement'])

                           value
Trial    measurement       

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34 

然后df.reset_index(inplace=True)将像魅力一样工作。

在按年和月对名为datetime的列(不是索引)进行分组之后,我遇到了这个问题live_date,这意味着年和月都被命名了live_date


1
如何让您的试用价值重演?我遇到了同样的问题,除了我的价值观不重复之外,它也起作用。
Rich

4

正如@ cs95在评论中提到的,要仅降低一个级别,请使用:

df.reset_index(level=[...])

这样可以避免在重置后必须重新定义所需的索引。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.