【问题标题】:Pandas: get multiindex level as seriesPandas:将多索引级别作为系列
【发布时间】:2016-12-27 00:32:23
【问题描述】:

我有一个具有多个级别的数据框,例如:

idx = pd.MultiIndex.from_product((['foo', 'bar'], ['one', 'five', 'three' 'four']),
                                 names=['first', 'second'])
df = pd.DataFrame({'A': [np.nan, 12, np.nan, 11, 16, 12, 11, np.nan]}, index=idx).dropna().astype(int)

              A     
first second
foo   five     12
      four     11
bar   one      16
      five     12
      three    11

我想使用标题为second 的索引级别创建一个新列,以便得到

              A    B  
first second
foo   five     12   five
      four     11   four
bar   one      16   one
      five     12   five
      three    11   three

我可以通过重置索引、复制列、然后重新应用来做到这一点,但这似乎更加迂回。

我尝试了df.index.levels[1],但这会创建一个排序列表,它不会保留顺序。

如果它是单个索引,我会使用df.index,但在创建一列元组的多索引中。

如果这在其他地方得到解决,请分享,因为我没有任何运气搜索 stackoverflow 档案。

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:
    df['B'] = df.index.get_level_values(level=1)  # Zero based indexing.
    # df['B'] = df.index.get_level_values(level='second')  # This also works.
    >>> df
                   A      B
    first second           
    foo   one     12    one
          two     11    two
    bar   one     16    one
          two     12    two
          three   11  three
    

    【讨论】:

    • 是否可以通过索引名来做?
    • 是的。 df.index.get_level_values(level='second') 也可以。
    • 如果多索引位于列上而不是使用df.columns.get_level_values(level=1) 的索引上,您也可以这样做。
    【解决方案2】:
    df['B'] = idx.to_series().str[1]
    

    【讨论】:

      【解决方案3】:

      如果您想使用索引名称(而不是数字索引)获取索引列值,我可以从 @AlbertoGarcia-Raboso 的回答中借用这个。

      请注意,这会为您提供仍然包含索引列的输出,它是一个系列,正如问题所要求的那样。乍一看,这看起来像是一个重复的列。

      df.index.to_frame()['second']
      

      (然后例如用df.index.to_frame()['second'][8]询问第9个系列项目)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-19
        • 1970-01-01
        • 1970-01-01
        • 2015-04-06
        • 2021-09-07
        • 1970-01-01
        • 2020-04-29
        相关资源
        最近更新 更多