我有一个pandas(版本 1.0.5)DataFrame有MultiIndex两个级别的 a,例如:
mi = pd.MultiIndex.from_product((('a', 'c'), (5, 12)))
np.random.seed(123)
df = pd.DataFrame(data=np.random.rand(4, 2), index=mi, columns=['x', 'y'])
Run Code Online (Sandbox Code Playgroud)
我想在 MultiIndexreindex的第一级包含键['a', 'b', 'c', 'd']。缺失的值应该用np.nan.
对于非多索引数据帧,我只需使用df.reindex(index=['a', 'b', 'c', 'd']).
现在有了MultiIndex,我认为这应该可以工作(我还尝试了所有其他参数组合labels,axis和index):
df.reindex(index=['a', 'b', 'c', 'd'], level=0)
Run Code Online (Sandbox Code Playgroud)
但相反,它似乎完全忽略了该reindex方法并返回未更改的数据帧:
x y
a 5 0.696469 0.286139
12 0.226851 0.551315
c 5 0.719469 0.423106
12 0.980764 0.684830
Run Code Online (Sandbox Code Playgroud)
我可以重新索引 MultiIndex 的唯一方法是完全生成一个新的MultiIndex:
df.reindex(index=pd.MultiIndex.from_product((
['a', 'b', 'c', 'd'], df.index.get_level_values(1).unique())))
Run Code Online (Sandbox Code Playgroud)
恕我直言,必须有一种更简单的方法来做到这一点,否则我看不到level该reindex方法的参数有任何用处。此外,我经常有几个索引级别,这使得重新索引非常麻烦。
我错过了什么吗?知道如何直接重新索引而不必显式生成新的多索引吗?
这种行为不是预期的。在 1.2.3 版本中,将level参数传递reindex给 aMultiIndex似乎仍然被破坏pandas。github上有一个问题涉及这个:
https://github.com/pandas-dev/pandas/issues/25460