我有一个
pandas
(版本 1.0.5)DataFrame
,其中 MultiIndex
有两个级别,例如喜欢:
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'])
我想要
reindex
MultiIndex 的第一级 包含键 ['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)
但相反,它似乎完全忽略了
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
我可以重新索引 MultiIndex 的唯一方法是 完全生成一个新的
MultiIndex
:
df.reindex(index=pd.MultiIndex.from_product((
['a', 'b', 'c', 'd'], df.index.get_level_values(1).unique())))
恕我直言,必须有一种更简单的方法来做到这一点,否则我看不到
level
方法的参数 reindex
有任何用处。此外,我经常有多个索引级别,这使得重新索引变得极其麻烦。
我错过了什么吗? 知道如何直接重新索引而无需显式生成新的多重索引吗?
def reindex_by_level(df, level_name, level_values):
# Reset the index
df_reset = df.reset_index()
# Make level_name = 'a' or other names a regular column and reindex with respect to the level_name 'a' column
df_reindexed = df_reset.set_index(level_name).reindex(level_values).reset_index()
# Set the original index back
return df_reindexed.set_index(df.index.names)