Python 在多索引/多级数据帧中重命名级别

Python 在多索引/多级数据帧中重命名级别,python,pandas,Python,Pandas,我有这样一个数据帧: arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']), np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']), np.array(['2016-01', '2016-02', '2016-01', '2016-02', '2016-01', '2016-02

我有这样一个数据帧:

arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
          np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']),
          np.array(['2016-01', '2016-02', '2016-01', '2016-02', '2016-01', '2016-02', '2016-01', '2016-02'])]
df = pd.DataFrame(np.ceil(np.random.randn(8, 4)), index=arrays)

df.rename(columns={0:'m1',1:'m2',2:'m3',3:'m4'},inplace=True)

                  m1   m2   m3   m4
bar one 2016-01 -0.0  1.0  3.0  2.0
    two 2016-02  1.0  1.0  1.0  2.0
baz one 2016-01 -1.0 -1.0  2.0  1.0
    two 2016-02  1.0  2.0  1.0  2.0
foo one 2016-01  1.0 -0.0 -0.0 -0.0
    two 2016-02 -2.0 -0.0 -0.0 -0.0
qux one 2016-01 -0.0 -0.0 -1.0  1.0
    two 2016-02 -0.0 -0.0  1.0 -0.0
假设我想在m2和m4的列名中替换2017年的所有2016行,这样2016行将有m1和m3的值,而不是m2和m4的值。因此2017行将具有m2和m4的值,而不是m1和m3的值。类似于此数据帧的内容:

我试图取消数据帧的堆栈并重命名每一列,但这似乎不起作用,我也不知道为什么

df = df.unstack()
df.unstack()['m2'] = df.unstack()['m2'].rename(columns = lambda t: t.replace('2016','2017'))

我不确定我是否完全理解你的问题,以下是我所做的和输出

    arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
          np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']),
          np.array(['2016-01', '2016-02', '2016-01', '2016-02', '2016-01', '2016-02', '2016-01', '2016-02'])]
df = pd.DataFrame(np.ceil(np.random.randn(8, 4)), index=arrays)

df.rename(columns={0:'m1',1:'m2',2:'m3',3:'m4'},inplace=True)
df = df.reset_index()
df['level_2'] = df['level_2'].str.replace("2016","2017")
这给了我输出:

level_0  level_1  level_2  m1  m2  m3  m4

0   bar    one    2017-01 -0.0 -1.0 -0.0 -0.0
1   bar    two    2017-02 -0.0  -1.0 2.0  2.0
2   baz    one    2017-01  -2.0 1.0 -0.0  1.0
3   baz    two    2017-02  -0.0 1.0 -1.0  2.0
4   foo    one    2017-01  1.0  -0.0 -1.0 -0.0
5   foo    two    2017-02  -1.0 -2.0  1.0 -0.0
6   qux    one    2017-01   1.0 1.0  -0.0  1.0
7   qux    two    2017-02   1.0 -1.0  2.0 -1.0
如果你能让我知道你期望的是什么,我会修改我的答案

import numpy as np
import pandas as pd
np.random.seed(2017)

arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
          np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']),
          np.array(['2016-01', '2016-02', '2016-01', '2016-02', '2016-01', '2016-02', '2016-01', '2016-02'])]
df = pd.DataFrame(np.ceil(np.random.randn(8, 4)), index=arrays)

df.rename(columns={0:'m1',1:'m2',2:'m3',3:'m4'},inplace=True)

df2 = df[['m2', 'm4']]
df2.index = pd.MultiIndex.from_arrays(
    [df.index.get_level_values(i) for i in [0,1]]
    + [df.index.get_level_values(-1).str.replace('2016','2017')])

result = pd.concat([df[['m1','m3']], df2], axis=0).fillna(0)
result = result.sort_index(level=[0,2,1])
print(result)
皈依

                  m1   m2   m3   m4
bar one 2016-01 -1.0 -0.0  1.0  1.0
    two 2016-02 -0.0 -0.0 -0.0 -0.0
baz one 2016-01  1.0 -0.0 -1.0 -0.0
    two 2016-02 -1.0  1.0  1.0 -0.0
foo one 2016-01 -0.0 -0.0 -1.0 -1.0
    two 2016-02  2.0 -0.0 -0.0 -0.0
qux one 2016-01  1.0  2.0 -0.0  2.0
    two 2016-02  1.0  1.0 -0.0 -0.0
进入


很抱歉,我这样做是为了缩小示例。我只想更改一些度量的日期,然后将它们添加到索引中。这就是为什么[baz,[1,2]]重复,但日期不同。是的,我认为我解释得不对。例如,根据列名的不同,您的2级考试应该有2016年和2017年的混合日期。现在,我的df有2016年的所有日期。但其中一些日期实际上是2017年。我这样做是为了简化计算,但现在我有了结果,我想把结果改到2017年。我想另一种看待这一点的方式是:如何将仅m1的水平_2更改为2016年。这意味着m2…m4将保持不变,但df将有额外的行,其值仅为m1,其中一些日期实际上是2017年。我这样做是为了简化计算,但现在我有了结果,我想把结果改成2017年-哇!这听起来是一个非常脆弱的方法来获得结果!也许你应该重新思考如何有效地对正确日期的记录进行分析的问题?我同意。你需要改变你的问题。
                  m1   m2   m3   m4
bar one 2016-01 -1.0 -0.0  1.0  1.0
    two 2016-02 -0.0 -0.0 -0.0 -0.0
baz one 2016-01  1.0 -0.0 -1.0 -0.0
    two 2016-02 -1.0  1.0  1.0 -0.0
foo one 2016-01 -0.0 -0.0 -1.0 -1.0
    two 2016-02  2.0 -0.0 -0.0 -0.0
qux one 2016-01  1.0  2.0 -0.0  2.0
    two 2016-02  1.0  1.0 -0.0 -0.0
                  m1   m2   m3   m4
bar one 2016-01 -1.0  0.0  1.0  0.0
    two 2016-02 -0.0  0.0 -0.0  0.0
    one 2017-01  0.0 -0.0  0.0  1.0
    two 2017-02  0.0 -0.0  0.0 -0.0
baz one 2016-01  1.0  0.0 -1.0  0.0
    two 2016-02 -1.0  0.0  1.0  0.0
    one 2017-01  0.0 -0.0  0.0 -0.0
    two 2017-02  0.0  1.0  0.0 -0.0
foo one 2016-01 -0.0  0.0 -1.0  0.0
    two 2016-02  2.0  0.0 -0.0  0.0
    one 2017-01  0.0 -0.0  0.0 -1.0
    two 2017-02  0.0 -0.0  0.0 -0.0
qux one 2016-01  1.0  0.0 -0.0  0.0
    two 2016-02  1.0  0.0 -0.0  0.0
    one 2017-01  0.0  2.0  0.0  2.0
    two 2017-02  0.0  1.0  0.0 -0.0