生成缺失的多索引

时间:2018-09-11 08:53:43

标签: python pandas

具有一个数据框,例如:

myFrame = pd.DataFrame(np.random.randint(1000, size=[7,4]), 
index=[['GER','GER','GER','GER','FRA','FRA','FRA'],
['Phone','Email','Chat','Other','Phone','Chat','Email']])

                0   1   2   3
GER     Phone   765 876 588 933
        Email   819 364 42  73
        Chat    954 665 317 918
        Other   692 531 312 206
FRA     Phone   272 261 426 270
        Chat    158 172 347 902
        Email   453 721 67  6

如何轻松添加内部级别的缺失索引?例如。您会看到GER具有“其他”索引标签。我想将“其他”添加到所有国家/地区,并用例如0.可能有第三个外部索引(例如ITA),但可以找到另一个内部索引(例如SMS)。

最后,所有国家/地区的索引数量应完全相同。

谢谢!

1 个答案:

答案 0 :(得分:3)

reindexMultiIndex.from_product创建的unique一起使用,MultiIndex.get_level_values生成的每个级别的值:

mux = pd.MultiIndex.from_product([myFrame.index.get_level_values(0).unique(), 
                                  myFrame.index.get_level_values(1).unique()])  

print (myFrame.reindex(mux, fill_value=0))
             0    1    2    3
GER Phone  250  614  226  777
    Email  917  156  148  902
    Chat   537  665   87   75
    Other  431  203  921  572
FRA Phone  159  790  646  810
    Email  294  205  949  726
    Chat   209  895  128  282
    Other    0    0    0    0

排序为unstackstack-MultiIndex的另一种解决方案:

print (myFrame.unstack(fill_value=0).stack(dropna=False))

             0    1    2    3
FRA Chat   209  895  128  282
    Email  294  205  949  726
    Other    0    0    0    0
    Phone  159  790  646  810
GER Chat   537  665   87   75
    Email  917  156  148  902
    Other  431  203  921  572
    Phone  250  614  226  777