pandas 重新索引多重索引无法正常工作

问题描述 投票:0回答:2

我有一个

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
有任何用处。此外,我经常有多个索引级别,这使得重新索引变得极其麻烦。

我错过了什么吗? 知道如何直接重新索引而无需显式生成新的多重索引吗?

python pandas
2个回答
3
投票
这种行为不是预期的。在

level

 上将 
reindex
 参数传递给 
MultiIndex
 似乎在 
pandas
 版本 1.2.3 中仍然存在问题。 github 上有一个问题涉及这个:

https://github.com/pandas-dev/pandas/issues/25460


0
投票
一种解决方法是重置索引以将特定级别作为常规列使用。

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)
    
© www.soinside.com 2019 - 2024. All rights reserved.