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

我怎样才能做到最好呢?

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


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

你所要做的就是在DataFrame的名字后面调用.reset_index():

df = df.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。


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

df.reset_index(水平=[…])

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


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

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

df = df.reset_index()


可能会出现df.reset_index()不能使用的情况(例如,当你也需要索引时)。在这种情况下,使用index.get_level_values()直接访问索引值:

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

这将为各个列分配索引值并保留索引。

更多信息请参见文档。


简短而简单

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

类似于更广义的Alex解。它保持索引不变,并将索引级别添加为具有其名称的新列。

for i in df.index.names:
    df[i] = df.index.get_level_values(i)

这给了

                   value Trial    measurement
Trial measurement             
    1           0     13     1              0     
                1      3     1              1     
                2      4     1              2     
  ...  

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

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