【问题标题】:Turn Pandas Multi-Index into column将 Pandas 多索引变成列
【发布时间】: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,但如果我的列用作索引,我就无法选择这样的列。

【问题讨论】:

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

标签: python pandas dataframe flatten multi-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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-17
      • 2018-07-29
      • 1970-01-01
      • 2021-12-12
      • 2017-03-04
      • 2018-11-21
      • 2015-05-18
      相关资源
      最近更新 更多