追加到熊猫多索引

时间:2018-11-05 19:09:25

标签: python pandas

我有一个使用以下方式创建的多索引的Pandas数据框:

indices = [['one', 'two', 'three', 'four'], ['oob']]
index = pd.MultiIndex.from_product(indices, names=['first', 'second'])

results = pd.DataFrame(index=index, columns=['col1', 'col2', 'col3', 'col4', 'col5'])

... input values ...

                    col1    col2    col3    col4    col5
   first    second
     one    oob     0.87    0.56    0.46    0.50    0.48
     two    oob     0.87    0.57    0.23    0.33    0.26
   three    oob     0.76    0.25    0.36    0.30    0.33
    four    oob     0.73    0.23    0.38    0.29    0.33

我想做的是在数据框中添加一个新的级别(我相信这是正确的术语),这样它将看起来像这样:

                    col1    col2    col3    col4    col5
   first    second
     one    oob     0.87    0.56    0.46    0.50    0.48
     one    meh     NaN     NaN     NaN     NaN     Nan
     two    oob     0.87    0.57    0.23    0.33    0.26
     two    meh     NaN     NaN     NaN     NaN     Nan
   three    oob     0.76    0.25    0.36    0.30    0.33
   three    meh     NaN     NaN     NaN     NaN     Nan
    four    oob     0.73    0.23    0.38    0.29    0.33
    four    meh     NaN     NaN     NaN     NaN     Nan

我已经设法通过重新创建索引然后调用resutlts.reindex(index=index)来实现此目的,但这似乎有点麻烦,并且需要将原始索引保存在某个变量中。有没有更好的方法可以做到这一点。

出于完整性考虑,我也尝试使用concat,但我确实在这里被暗中刺伤。

1 个答案:

答案 0 :(得分:2)

.reindex仍然可以工作。无需保存原始索引,因为您可以直接从results获取它们。

import pandas as pd

newidx = [results.index.levels[0],
          results.index.levels[1].append(pd.Index(data=['meh']))]

results.reindex(pd.MultiIndex.from_product(newidx, names=results.index.names))

              col1  col2  col3  col4  col5
first second                              
one   oob      1.0   1.0   1.0   1.0   1.0
      meh      NaN   NaN   NaN   NaN   NaN
two   oob      1.0   1.0   1.0   1.0   1.0
      meh      NaN   NaN   NaN   NaN   NaN
three oob      1.0   1.0   1.0   1.0   1.0
      meh      NaN   NaN   NaN   NaN   NaN
four  oob      1.0   1.0   1.0   1.0   1.0
      meh      NaN   NaN   NaN   NaN   NaN