将Pandas多索引转换为列

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

我怎样才能做到最好呢?

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

206561 次浏览

reset_index ()是一个pandas DataFrame方法,它将索引值作为列传输到DataFrame中。该参数的默认设置是= 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(level=[...])

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

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

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

enter image description here

df = df.reset_index()

enter image description here

可能存在不能使用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()

类似于更广义形式的亚历克斯的解决方案。它保持索引不变,并将索引级别添加为具有其名称的新列。

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
...