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

我怎样才能做到最好呢?

我需要这样做是因为我想按照这里的指示聚合数据,但是如果我的列被用作索引,我就不能这样选择它们。


当前回答

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

df.reset_index(水平=[…])

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

其他回答

当不是每个列都有多个索引级别时,一个解决方案可能会有帮助:

df.columns = df.columns.map(''.join)

我也遇到了卡尔的问题。我只是重新命名了聚合列,然后重新设置了索引。

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

df = df.reset_index()

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

df.reset_index(水平=[…])

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

简短而简单

df2 = pd.DataFrame({'test_col': df['test_col'].describe()})
df2 = df2.reset_index()

这并不适用于你的情况,但可能对其他人(比如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。