2016-04-22 461 views
1

我的最终目标是在(2,2)多索引数据框内为两行计算pct_change,但我希望pct_change行出现在其他两行的下方。我知道pct_change()方法,但不会创建一个新行,所以我将pct_change作为单独的数据框计算,并将pct_change行附加到现有数据框。这是一个示例数据框。Python Pandas多重索引:重命名特定索引行值

df = pd.DataFrame(data={ 
    'A': [94128, 28198, -70.04], 'B': [3627, 1483, -59.11]}, 
        index=pd.MultiIndex.from_tuples([('Label', '(Jun 1, 2014-Mar 31, 2015)'), 
                ('Label', '(Jun 1, 2015-Mar 31, 2016)'), 
                ('Label', '(Jun 1, 2015-Mar 31, 2016)')], 
                names=['Text', 'Period'])) 

是这样的:

          A  B 
Text Period          
Label (Jun 1, 2014-Mar 31, 2015) 94128.00 3627.00 
     (Jun 1, 2015-Mar 31, 2016) 28198.00 1483.00 
     (Jun 1, 2015-Mar 31, 2016) -70.04 -59.11 

这是一个多指标,我要重命名的最后Period行值说% Change

所需的输出:

          A  B 
Text Period          
Label (Jun 1, 2014-Mar 31, 2015) 94128.00 3627.00 
     (Jun 1, 2015-Mar 31, 2016) 28198.00 1483.00 
         % Change -70.04 -59.11 

是什么,我想给它多指标的复杂性做甚至可能吗?

>>> df.index 
MultiIndex(levels=[['Label'], ['(Jun 1, 2014-Mar 31, 2015)', '(Jun 1, 2015-Mar 31, 2016)']], 
      labels=[[0, 0, 0], [0, 1, 1]], 
      names=['Text', 'Period']) 

回答

1

我觉得你首先get_level_valuesPeriod水平tolist可以通过索引[:-1]删除最后一个值,并添加新的列表['% Change']。最后创建新MultiIndexfrom_tuples

print df.index.get_level_values('Period')[:-1].tolist() + ['% Change'] 
['(Jun 1, 2014-Mar 31, 2015)', '(Jun 1, 2015-Mar 31, 2016)', '% Change'] 

#change multiindex 
new_index = zip(df.index.get_level_values('Text'), 
       df.index.get_level_values('Period')[:-1].tolist() + ['% Change']) 

df.index = pd.MultiIndex.from_tuples(new_index, names = df.index.names) 
print df 
             A  B 
Text Period          
Label (Jun 1, 2014-Mar 31, 2015) 94128.00 3627.00 
     (Jun 1, 2015-Mar 31, 2016) 28198.00 1483.00 
     % Change      -70.04 -59.11 

print df.index 
MultiIndex(levels=[[u'Label'], 
      [u'% Change', u'(Jun 1, 2014-Mar 31, 2015)', u'(Jun 1, 2015-Mar 31, 2016)']], 
      labels=[[0, 0, 0], [1, 2, 0]], 
      names=[u'Text', u'Period']) 
+0

太棒了!我必须使用'list(zip(...))'python 3),但是你的方法很有意义。所以外卖就是创建一个包含'%Change'值的全新索引,然后用'new_index'换出当前的多索引。 – Jarad