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