Python 在特定级别上重新索引多索引 安装程序

Python 在特定级别上重新索引多索引 安装程序,python,pandas,Python,Pandas,我想用df1.index.levels[0]重新索引df2.index.levels[0] 我所做的: import pandas as pd import numpy as np from string import ascii_lowercase tidx = pd.date_range(end='2016-04-30', freq='M', periods=3) tidx2 = tidx + pd.offsets.MonthBegin(-1) + pd.offsets.Day(15) +

我想用
df1.index.levels[0]
重新索引
df2.index.levels[0]

我所做的:

import pandas as pd
import numpy as np
from string import ascii_lowercase

tidx = pd.date_range(end='2016-04-30', freq='M', periods=3)
tidx2 = tidx + pd.offsets.MonthBegin(-1) + pd.offsets.Day(15) + pd.offsets.BDay(-1)

np.random.seed([3,1415])

df1 = pd.DataFrame(np.random.rand(9, 1), columns=['Value'],
                   index=pd.MultiIndex.from_product([tidx, list(ascii_lowercase)[:3]]))
df2 = pd.DataFrame(np.random.rand(9, 1), columns=['Value'],
                   index=pd.MultiIndex.from_product([tidx2, list(ascii_lowercase)[:3]]))
看起来像:

 df1.unstack().reindex(df2.unstack().index, method='ffill').stack()
然而,这并不适用于超过2个级别的多索引

问题:
什么是对索引的特定级别重新编制索引的一般方法?

编辑:新的解决方案,可能更符合问题的精神:

                 Value
2016-02-29 a  0.757983
           b  0.934829
           c  0.831104
2016-03-31 a  0.879891
           b  0.926879
           c  0.721535
2016-04-30 a  0.117642
           b  0.145906
           c  0.199844
我们的想法是按照级别1分组,然后像往常一样重新编制索引。与以前的解决方案不同,这将执行基于时间的正向填充

第二次编辑:为了推广到多个级别,将
level=1
替换为:

def func(dfg):
    return dfg.reset_index(level=1, drop=True).reindex(df1.index.levels[0], method='ffill')

df2.groupby(level=1).apply(func).swaplevel(i=0, j=1).sortlevel(0)
在两个函数调用中


先前的答案

我不知道这是否适用于所有情况,但在本例中,它会返回您想要的结果:

level=list(range(1, df2.index.nlevels))
结果:

df2.index.set_levels(df1.index.get_level_values(0), level=0)

我已经编辑了我的答案。。。再一次:)谢谢你。我已经用同样的方法概括了。我知道我没有贴出来。我想让人们有新的视角。这确实回答了这个问题,除非有更清晰的答案出现,否则我会将其标记为这样。再次感谢你的努力。同意,这并不优雅!我是否应该(暂时)删除我的答案,以免影响他人。此外,一个没有答案的向上投票的问题更容易引起注意。游戏技巧;)
In [12]: df2
Out[12]: 
                 Value
2016-02-29 a  0.757983
           b  0.934829
           c  0.831104
2016-03-31 a  0.879891
           b  0.926879
           c  0.721535
2016-04-30 a  0.117642
           b  0.145906
           c  0.199844