210

我有一个具有 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 

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

我需要这个,因为我想按照此处的说明聚合数据,但如果它们用作索引,我不能像这样选择我的列。

4

5 回答 5

255

reset_index ()是一个 pandas DataFrame 方法,它将索引值作为列传输到 DataFrame 中。该参数的默认设置是drop=False(这会将索引值保留为列)。

您只需.reset_index()在 DataFrame 的名称之后调用:

df = df.reset_index()  
于 2014-09-08T21:42:18.217 回答
33

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

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

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 

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

我在一个名为 的日期时间列(不是索引)上按年和月分组后遇到了这个问题live_date,这意味着年和月都被命名为live_date

于 2017-11-17T17:46:41.007 回答
16

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

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

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

于 2019-05-20T00:06:01.153 回答
13

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

df['Trial'] = df.index.get_level_values(0)
df['measurement'] = df.index.get_level_values(1)

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

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

于 2020-10-27T08:39:24.837 回答
2

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

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

在此处输入图像描述

df = df.reset_index()

在此处输入图像描述

于 2020-09-28T16:37:48.593 回答