将 Pandas 多索引变成列

Posted

技术标签:

【中文标题】将 Pandas 多索引变成列【英文标题】:Turn Pandas Multi-Index into column 【发布时间】:2018-10-12 17:42:53 【问题描述】:

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

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

我需要这个,因为我想聚合数据 as instructed here,但如果我的列用作索引,我就无法选择这样的列。

【问题讨论】:

重复:***.com/questions/18624039/… 你想要第一个建议。 .reset_index() 非常感谢,我实际上浏览了很多,但是“使多索引到列”和类似的查询总是让我想转动他们的数据框...... 当你已经知道答案时总是更容易找到答案:) 【参考方案1】:

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

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

df = df.reset_index()  

【讨论】:

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

这并不真正适用于您的情况,但可能有助于其他人(例如 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

【讨论】:

如何让你的 Trial 价值观重演?我遇到了同样的问题,但我的价值观不会重复。【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

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

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

请参阅docs 了解更多信息。

【讨论】:

这太有用了!应该可以使用更清晰的语言来做到这一点,例如df['measurement'] = df.index.values(1).【参考方案5】:

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

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

df = df.reset_index()

【讨论】:

以上是关于将 Pandas 多索引变成列的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:如何向多索引数据框添加列?

Pandas 将列多索引转换为行多索引

将数据分组到 Pandas 多索引

使用 Python/Pandas 将多索引数据写入 excel 文件

使用多索引列连接两个 pandas 数据框

使用 Pandas 从多索引表中绘制特定列