Python Pandas多索引:重命名特定索引行值

时间:2016-04-22 17:02:36

标签: python pandas rename multi-index

我的最终目标是计算(2,2)多索引数据帧中两行的pct_change,但我希望pct_change行显示在其他两行之下。我知道pct_change()方法,但不会创建新行,而是将pct_change计算为单独的数据帧,并将pct_change行附加到现有数据帧。这是一个示例数据帧。

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 个答案:

答案 0 :(得分:1)

我认为您可以先get_level_values级别Period tolist,通过索引[:-1]删除最后一个值并添加新列表['% Change']。最后创建新的MultiIndex from_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'])