【问题标题】:python - Pandas - Dataframe.set_index - how to keep the old index columnpython - Pandas - Dataframe.set_index - 如何保留旧的索引列
【发布时间】:2018-09-18 02:59:09
【问题描述】:

我有这个Dataframe

import pandas as pd
df = pd.DataFrame({'Hugo' : {'age' : 21, 'weight' : 75},
                   'Bertram': {'age' : 45, 'weight' : 65},
                   'Donald' : {'age' : 75, 'weight' : 85}}).T
df.index.names = ['name']


         age  weight
name                
Bertram   45      65
Donald    75      85
Hugo      21      75

我想将索引更改为'age'列:

df.set_index('age', inplace=True)

     weight
age        
45       65
75       85
21       75

旧的索引列名称丢失。有没有办法在不丢失原始索引列并再次将旧列作为“普通”列的情况下更改索引,使其看起来像这样?

     name       weight
age        
45   Bertram    65
75   Donald     85
21   Hugo       75

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    先使用reset_index,然后使用set_index

    df = df.reset_index().set_index('age')
    print (df)
            name  weight
    age                 
    45   Bertram      65
    75    Donald      85
    21      Hugo      75
    

    【讨论】:

      【解决方案2】:

      添加append=Truereset_index

      df.set_index('age', append=True).reset_index(level=0)
      Out[80]: 
              name  weight
      age                 
      45   Bertram      65
      75    Donald      85
      21      Hugo      75
      

      【讨论】:

      • 这可能比接受的答案更有效。
      【解决方案3】:

      以下是最有效的,因为它附加了age 的新索引并确保其就位

      df.set_index('age',append=True,inplace=True)
      

      【讨论】:

      • 我们需要使用reset_index(level = 0)。您的回答无效
      【解决方案4】:

      您的 DataFrame dfname (= 'Bertram', 'Donald', 'Hugo') 作为索引

      也就是说,你的df是:

               age  weight
      name                
      Bertram   45      65
      Donald    75      85
      Hugo      21      75
      

      您可以使用 .reset_index() 方法将索引 (name) 转换为 DataFrame df 内的新列。

      df.reset_index(inplace=True)
      

      name 变成一列,新索引是标准的默认整数索引:

      你的 df 现在看起来像这样:

      Out[1]:    
          name     age  weight
      
      0   Bertram   45      65
      1   Donald    75      85
      2   Hugo      21      75
      

      现在,您可以使用 .set_index() 方法将索引更改为 age

      df.set_index('age',inplace=True)
      

      df现在是:

      Out[2]: 
           name  weight
      age                 
      45   Bertram      65
      75   Donald       85
      21   Hugo         75
      

      正如 @jezrael 指出的那样,您可以一步完成,而不是两个步骤,如下所示:

      df = df.reset_index().set_index('age')
      

      【讨论】:

        【解决方案5】:

        将 drop 变量更改为 False。

        df = df.set_index("age", drop=False)
        

        【讨论】:

        • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
        • 我们需要使用reset_index(level = 0)。你的回答无效
        猜你喜欢
        • 1970-01-01
        • 2018-01-15
        • 2018-11-06
        • 2013-09-08
        • 2020-04-30
        • 1970-01-01
        • 2018-05-02
        • 2013-06-29
        • 2012-11-14
        相关资源
        最近更新 更多