【问题标题】:How to convert index of a pandas dataframe into a column如何将熊猫数据框的索引转换为列
【发布时间】:2013-12-26 00:05:49
【问题描述】:

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

例如:

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  

【问题讨论】:

    标签: python pandas dataframe indexing series


    【解决方案1】:

    要么:

    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
    

    【讨论】:

    • 您能否在刚刚添加到数据框中的列上建立索引,使其成为真正的列和索引?
    • 如果要转换整个多索引,只需使用df.reset_index(),它将整个索引移动到列中(每级一列)并创建一个从 0 到 len(df) 的 int 索引)-1
    • 我对每个项目都有一个元组的分类索引,我想只从元组中的一个项目创建一个新列。关于如何从索引中仅提取一项的任何想法?
    • 分配给列,例如df['index1'] = df.index 返回警告:“试图在数据帧的切片副本上设置值。”请改用 df.assign() 函数,如下所示。
    • 我遇到了这样的问题,当我尝试这个解决方案时,我没有得到任何结果。然而@venti 解决方案正是我想要的。
    【解决方案2】:

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

    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())
    

    【讨论】:

      【解决方案3】:

      对于 MultiIndex,您可以使用

      提取其子索引
      df['si_name'] = R.index.get_level_values('si_name') 
      

      其中si_name 是子索引的名称。

      【讨论】:

        【解决方案4】:

        rename_axis + reset_index

        您可以先将索引重命名为所需的标签,然后提升为系列:

        df = df.rename_axis('index1').reset_index()
        
        print(df)
        
           index1         gi  ptt_loc
        0       0  384444683      593
        1       1  384444684      594
        2       2  384444686      596
        

        这也适用于MultiIndex 数据帧:

        print(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
        
        df = df.rename_axis(['index1', 'index2', 'index3']).reset_index()
        
        print(df)
        
               index1 index2  index3     val
        0  2016-02-26      C       2  0.0139
        1  2016-02-27      A       2  0.5577
        2  2016-02-28      C       6  0.0303
        

        【讨论】:

        • 很好的答案@jpp。非常感谢它解决了我的问题
        【解决方案5】:

        这应该可以解决问题(如果不是多级索引) -

        df.reset_index().rename({'index':'index1'}, axis = 'columns')
        

        当然,如果您不想将其分配给 rename 函数参数中的新变量,您可以随时设置 inplace = True

        【讨论】:

        • 感谢您的解决方案!
        【解决方案6】:

        如果您想使用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
        

        【讨论】:

          【解决方案7】:
          df1 = pd.DataFrame({"gi":[232,66,34,43],"ptt":[342,56,662,123]})
          p = df1.index.values
          df1.insert( 0, column="new",value = p)
          df1
          
              new     gi     ptt
          0    0      232    342
          1    1      66     56 
          2    2      34     662
          3    3      43     123
          

          【讨论】:

          • 我建议添加一些关于为什么您认为这个答案比现有答案更好的讨论......
          • 这种使用 insert 方法的方法有助于将列插入 DataFrame 的左端(第一列)位置,而不是在右端(最后一列)插入列。因此,它在某些情况下可能非常有用。通过答案来解释可能会更好。
          猜你喜欢
          • 2021-12-08
          相关资源
          最近更新 更多