首页 文章

如何将pandas数据帧的索引转换为列?

提问于
浏览
262

这似乎相当明显,但我似乎无法弄清楚如何将数据框的索引转换为列?

例如:

df=
        gi       ptt_loc
 0  384444683      593  
 1  384444684      594 
 2  384444686      596

至,

df=
    index1    gi       ptt_loc
 0  0     384444683      593  
 1  1     384444684      594 
 2  2     384444686      596

4 回答

  • 23

    对于MultiIndex,您可以使用提取其子索引

    df['si_name'] = R.index.get_level_values('si_name')
    

    其中 si_name 是子索引的名称 .

  • 11

    为了更清晰,让我们看一下其索引中有两个级别的DataFrame(MultiIndex) .

    index = pd.MultiIndex.from_product([['TX', 'FL', 'CA'], 
                                        ['North', 'South']], 
                                       names=['State', 'Direction'])
    
    df = pd.DataFrame(index=index, 
                      data=np.random.randint(0, 10, (6,4)), 
                      columns=list('abcd'))
    

    使用默认参数调用的 reset_index 方法将所有索引级别转换为列,并使用简单的 RangeIndex 作为新索引 .

    df.reset_index()
    

    使用 level 参数控制将哪些索引级别转换为列 . 如果可能,请使用更明确的级别名称 . 如果没有级别名称,则可以通过其整数位置引用每个级别,该位置从外部开始为0 . 您可以在此处使用标量值,也可以使用要重置的所有索引的列表 .

    df.reset_index(level='State') # same as df.reset_index(level=0)
    

    在极少数情况下,您希望保留索引并将索引转换为列,您可以执行以下操作:

    # for a single level
    df.assign(State=df.index.get_level_values('State'))
    
    # for all levels
    df.assign(**df.index.to_frame())
    
  • 1

    如果要使用 reset_index 方法并保留现有索引,则应使用:

    df.reset_index().set_index('index', drop=False)
    

    或者改变它:

    df.reset_index(inplace=True)
    df.set_index('index', drop=False, inplace=True)
    

    例如:

    print(df)
              gi  ptt_loc
    0  384444683      593
    4  384444684      594
    9  384444686      596
    
    print(df.reset_index())
       index         gi  ptt_loc
    0      0  384444683      593
    1      4  384444684      594
    2      9  384444686      596
    
    print(df.reset_index().set_index('index', drop=False))
           index         gi  ptt_loc
    index
    0          0  384444683      593
    4          4  384444684      594
    9          9  384444686      596
    

    如果你想摆脱索引标签你可以做:

    df2 = df.reset_index().set_index('index', drop=False)
    df2.index.name = None
    print(df2)
       index         gi  ptt_loc
    0      0  384444683      593
    4      4  384444684      594
    9      9  384444686      596
    
  • 446

    之一:

    df['index1'] = df.index
    

    或者,.reset_index

    df.reset_index(level=0, inplace=True)
    

    所以,如果你有一个具有3个索引级别的多索引框架,例如:

    >>> df
                           val
    tick       tag obs        
    2016-02-26 C   2    0.0139
    2016-02-27 A   2    0.5577
    2016-02-28 C   6    0.0303
    

    并且您希望将索引中的第一个( tick )和第三个( obs )级别转换为列,您可以这样做:

    >>> df.reset_index(level=['tick', 'obs'])
              tick  obs     val
    tag                        
    C   2016-02-26    2  0.0139
    A   2016-02-27    2  0.5577
    C   2016-02-28    6  0.0303
    

相关问题