我有一个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