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