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

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

例如:

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 

之一:

 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 

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

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

其中si_name是子索引的名称。

为了更清楚一点,我们来看一下在索引中有两个级别的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) 

在这里输入图像说明

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

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