简体   繁体   中英

python - Pandas - Dataframe.set_index - how to keep the old index column

I have this 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

I want to change the index to the column 'age' :

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

     weight
age        
45       65
75       85
21       75

The old index-column name gets lost. Is there a way to change the index without losing the original index-column and getting the old column as 'normal' column again, so that it looks like this?

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

Use reset_index first and then set_index :

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

Adding the append=True and with reset_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

Your DataFrame df has name (= 'Bertram', 'Donald', 'Hugo' ) as index

That is, your df is:

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

You can convert the index ( name ) into a new column inside your DataFrame df by using the .reset_index() method.

df.reset_index(inplace=True)

name becomes a column and the new index is the standard default integer index:

Your df looks like this now:

Out[1]:    
    name     age  weight

0   Bertram   45      65
1   Donald    75      85
2   Hugo      21      75

Now, you can change the index to age with the .set_index() method.

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

df is now:

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

As @jezrael points out above you can do this in a single step, instead of two steps, like this:

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

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

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

将 drop 变量更改为 False。

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM