Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多索引:重命名特定索引行值_Python_Pandas_Rename_Multi Index - Fatal编程技术网

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

Python多索引:重命名特定索引行值,python,pandas,rename,multi-index,Python,Pandas,Rename,Multi Index,我的最终目标是为(2,2)多索引数据帧中的两行计算pct\u更改,但我希望pct\u更改行显示在其他两行的下方。我知道pct\u change()方法,但这不会生成新行,因此我将把pct\u更改计算为一个单独的数据帧,并将pct\u change行附加到现有的数据帧。下面是一个数据帧示例 df = pd.DataFrame(data={ 'A': [94128, 28198, -70.04], 'B': [3627, 1483, -59.11]}, ind

我的最终目标是为(2,2)多索引数据帧中的两行计算
pct\u更改
,但我希望
pct\u更改
行显示在其他两行的下方。我知道
pct\u change()
方法,但这不会生成新行,因此我将把pct\u更改计算为一个单独的数据帧,并将
pct\u 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
这是一个多索引,我想将最后一个
期间
行值重命名为
%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'])
我认为您可以在第一个级别
Period
,通过索引
[:-1]
删除最后一个值,并添加新列表
['%Change']
。上次新建:


令人惊叹的!我不得不使用
list(zip(…)
forpython3),但是您的方法很有意义。因此,需要做的是创建一个包含
%Change
值的全新索引,然后用
新索引
替换当前的多索引。
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'])