Python Pandas 多索引:重命名特定索引行值
Python Pandas Multi-index: Rename Specific Index Row Value
我的最终目标是计算 (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'])
我觉得你可以先get_level_values
of level Period
tolist
, remove last value by indexing [:-1]
and add new list ['% Change']
. Last create new 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'])
我的最终目标是计算 (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'])
我觉得你可以先get_level_values
of level Period
tolist
, remove last value by indexing [:-1]
and add new list ['% Change']
. Last create new 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'])