将Pandas Multi-Index变成列

The*_*era 131 python flatten multi-index dataframe pandas

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

                         value
Trial    measurement
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 
Run Code Online (Sandbox Code Playgroud)

我想转变成这个:

Trial    measurement       value

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34 
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能做到最好?

我需要这个,因为我想按照这里的指示聚合数据,但如果它们被用作索引,我就无法选择我的列.

小智 164

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

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

df.reset_index(inplace=True)  
Run Code Online (Sandbox Code Playgroud)

  • 对于我有3个索引级别的情况,就地重置不起作用。另一种方法是将新重置的数据帧分配给一个新的数据帧:df2 = df.reset_index() (3认同)
  • 要仅重置特定级别,请使用df.reset_index(level = [...]) (3认同)

Kar*_*nka 16

这并不适用于你的情况,但它可能对其他人(比如我5分钟前)有所帮助.如果一个人的多索引具有如下相同的名称:

                         value
Trial        Trial
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 
Run Code Online (Sandbox Code Playgroud)

df.reset_index(inplace=True) 将失败,因为创建的列不能共享名称.

那么你需要重命名多索引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 
Run Code Online (Sandbox Code Playgroud)

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

在按日期时间列(而不是索引)调用后按年和月分组时遇到此问题live_date,这意味着年份和月份都已命名live_date.


sam*_*gol 13

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

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

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


Ale*_*lex 9

可能存在df.reset_index()无法使用的情况(例如,当您也需要索引时)。在这种情况下,使用index.get_level_values()直接访问索引值:

df['Trial'] = df.index.get_level_values(0)
df['measurement'] = df.index.get_level_values(1)
Run Code Online (Sandbox Code Playgroud)

这会将索引值分配给各个列保留索引。

有关更多信息,请参阅文档

  • 这太有用了!应该可以使用更清晰的语言来做到这一点,例如`df['measurement'] = df.index.values(1)`。 (3认同)

kev*_*und 5

我也遇到了卡尔的问题。我刚刚发现自己重命名了聚合列,然后重置了索引。

df = pd.DataFrame(df.groupby(['arms', 'success'])['success'].sum()).rename(columns={'success':'sum'})
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

df = df.reset_index()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述