如何使用 MultiIndex 重新索引?

Xau*_*ume 6 python indexing multi-index pandas

我有一个这样的 DataFrame:

import pandas as pd
df = pd.DataFrame.from_dict({'var1': {0: 0.0,
  1: 0.0,
  2: 0.0,
  3: 0.0,
  4: 0.0,
  6: 0.0,
  7: 0.0,
  8: 0.0,
  10: 0.0},
 'var2': {0: 0.0,
  1: 0.0,
  2: 0.0,
  3: 0.0,
  4: 0.0,
  6: 0.0,
  7: 0.0,
  8: 0.0,
  10: 0.0},
 'var3': {0: 0.0,
  1: 0.0,
  2: 0.0,
  3: 0.0,
  4: 0.0,
  6: 0.0,
  7: 0.0,
  8: 0.0,
  10: 0.0},
 'var4': {0: 0.0,
  1: 0.0,
  2: 0.0,
  3: 0.0,
  4: 0.0,
  6: 0.0,
  7: 0.0,
  8: 0.0,
  10: 0.0}})
Run Code Online (Sandbox Code Playgroud)

我想填补缺失的索引,所以我.reindex首先使用:

df.reindex(np.arange(1, 11))
Run Code Online (Sandbox Code Playgroud)

我得到了:

    var1    var2    var3    var4
1   0.0     0.0     0.0     0.0
2   0.0     0.0     0.0     0.0
3   0.0     0.0     0.0     0.0
4   0.0     0.0     0.0     0.0
5   NaN     NaN     NaN     NaN
6   0.0     0.0     0.0     0.0
7   0.0     0.0     0.0     0.0
8   0.0     0.0     0.0     0.0
9   NaN     NaN     NaN     NaN
10  0.0     0.0     0.0     0.0
Run Code Online (Sandbox Code Playgroud)

但是,我需要跟踪多个索引,当我尝试构造 MultiIndex 并将其传递给.reindex它时,它并没有像我期望的那样工作:

    df.reindex(pd.MultiIndex.from_product([["A"], np.arange(1, 11)]))

        var1    var2    var3    var4
A   1   NaN     NaN     NaN     NaN
    2   NaN     NaN     NaN     NaN
    3   NaN     NaN     NaN     NaN
    4   NaN     NaN     NaN     NaN
    5   NaN     NaN     NaN     NaN
    6   NaN     NaN     NaN     NaN
    7   NaN     NaN     NaN     NaN
    8   NaN     NaN     NaN     NaN
    9   NaN     NaN     NaN     NaN
   10   NaN     NaN     NaN     NaN
Run Code Online (Sandbox Code Playgroud)

我真的不明白这里发生了什么.reindex,我的文档也不太清楚。有人可以就此给我建议并告诉我为什么不能将 MultiIndex 传递给.reindex或我做错了什么吗?

@编辑:

当我们从 1 级多索引转移到 2 级多索引时,@jazrael提供了一个很好的解决方案。但是,当我们想要从 2 级 MultiIndex 重新索引到 3 级 MultiIndex 时,该怎么办?

例如:

df.index = pd.MultiIndex.from_arrays([np.repeat([1, 2], [4, 5]), df.index])

        var1    var2    var3    var4
1   0   0.0     0.0     0.0     0.0
    1   0.0     0.0     0.0     0.0
    2   0.0     0.0     0.0     0.0
    3   0.0     0.0     0.0     0.0
2   4   0.0     0.0     0.0     0.0
    6   0.0     0.0     0.0     0.0
    7   0.0     0.0     0.0     0.0
    8   0.0     0.0     0.0     0.0
   10   0.0     0.0     0.0     0.0
Run Code Online (Sandbox Code Playgroud)

我想得到:

            var1    var2    var3    var4
A   1   0   0.0     0.0     0.0     0.0
        1   0.0     0.0     0.0     0.0
        2   0.0     0.0     0.0     0.0
        3   0.0     0.0     0.0     0.0
    2   4   0.0     0.0     0.0     0.0
        5   NaN     NaN     NaN     NaN
        6   0.0     0.0     0.0     0.0
        7   0.0     0.0     0.0     0.0
        8   0.0     0.0     0.0     0.0
        9   NaN     NaN     NaN     NaN
       10   0.0     0.0     0.0     0.0
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 3

因为想要reindex简单使用,所以不需要为 new 的第二级匹配MultiIndex设置索引:level=1MultiIndex

df = df.reindex(pd.MultiIndex.from_product([["A"], np.arange(1, 11)]), level=1)
print (df)
      var1  var2  var3  var4
A 1    0.0   0.0   0.0   0.0
  2    0.0   0.0   0.0   0.0
  3    0.0   0.0   0.0   0.0
  4    0.0   0.0   0.0   0.0
  5    NaN   NaN   NaN   NaN
  6    0.0   0.0   0.0   0.0
  7    0.0   0.0   0.0   0.0
  8    0.0   0.0   0.0   0.0
  9    NaN   NaN   NaN   NaN
  10   0.0   0.0   0.0   0.0
  
Run Code Online (Sandbox Code Playgroud)