python - Pandas - Dataframe.set_index - 如何保留旧索引列

Egi*_*ila 13 python python-3.x pandas

我有这个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
Run Code Online (Sandbox Code Playgroud)

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

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

     weight
age        
45       65
75       85
21       75
Run Code Online (Sandbox Code Playgroud)

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

     name       weight
age        
45   Bertram    65
75   Donald     85
21   Hugo       75
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 15

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
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 9

添加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
Run Code Online (Sandbox Code Playgroud)


pin*_*ash 5

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

也就是说,你df是:

         age  weight
name                
Bertram   45      65
Donald    75      85
Hugo      21      75
Run Code Online (Sandbox Code Playgroud)

您可以将指数(转换name)为您的数据帧中的新列df使用.reset_index()方法。

df.reset_index(inplace=True)
Run Code Online (Sandbox Code Playgroud)

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

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

Out[1]:    
    name     age  weight

0   Bertram   45      65
1   Donald    75      85
2   Hugo      21      75
Run Code Online (Sandbox Code Playgroud)

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

df.set_index('age',inplace=True)
Run Code Online (Sandbox Code Playgroud)

df就是现在:

Out[2]: 
     name  weight
age                 
45   Bertram      65
75   Donald       85
21   Hugo         75
Run Code Online (Sandbox Code Playgroud)

正如@jezrael上面指出的,你可以一步完成,而不是两步,像这样:

df = df.reset_index().set_index('age')
Run Code Online (Sandbox Code Playgroud)