Python:平衡数据集以进行回归分析(重新排列数据集并填充空白类别)

时间:2018-11-29 18:49:27

标签: python pandas dataframe multi-index

我有一个数据集(df2),其外观如下:

                            total_n
  ind_n4   year  city_code
     9     2003     a          236
           2004     a          520
    54     2002     b          167
           2004     b          997
           2005     b          476
           2006     b          742 

数据集示例:

df = pd.DataFrame( {'year':[2003,2004,2002,2004,2005,2006],
                    'city_code':['a']*2+['b']*4,
                    'total_tax':pd.np.random.randint(100,1000,6)},
                   index=pd.Index(data=[9]*2+[54]*4,name='ind_n4'))

df1 = df.set_index('year',append=True)
df2 = df1.set_index('city_code',append=True)

我正在寻找的输出是一个看起来像这样的余额表:

                            total_n
  ind_n4  city_code  year  
     9        a      2002      0
                     2003     236
                     2004     520
                     2005      0
                     2006      0
              b      2002      0
                     2003      0
                     2004      0
                     2005      0
                     2006      0

    54        a      2002      0
                     2003      0
                     2004      0
                     2005      0
                     2006      0
              b      2002     167
                     2003      0
                     2004     997
                     2005     476
                     2006     742

为此,我一直在使用这种方法,在Python Pandas: Balance an unbalanced dataset (for panel analysis)的一个相当相似的示例中提出了这种方法:

df_balanced = (df.set_index('year',append=True)
                 .reindex(pd.MultiIndex.from_product([df.index.unique(),
                                                      range(df.year.min(),df.year.max()+1)],
                                                     names=['id_inf','year']))
                 .reset_index(level=1))

但是,当我使用此代码时,出现了一条错误消息:NotImplementedError:未为MultiIndex定义isna

非常感谢您的帮助

1 个答案:

答案 0 :(得分:2)

使用此:

df3 = df2.swaplevel(1,2)
df3.reindex(pd.MultiIndex.from_product(df3.index.levels), fill_value=0)\
   .rename_axis(df3.index.names, axis=0)

输出:

                       total_tax
ind_n4 city_code year           
9      a         2002          0
                 2003        317
                 2004        233
                 2005          0
                 2006          0
       b         2002          0
                 2003          0
                 2004          0
                 2005          0
                 2006          0
54     a         2002          0
                 2003          0
                 2004          0
                 2005          0
                 2006          0
       b         2002        956
                 2003          0
                 2004        609
                 2005        626
                 2006        811

详细信息:

  • 如果需要,使用swaplevel来获取正确的索引级别 订单。
  • 使用索引级别的pd.MultiIndex.from_product,可以创建 所有组合都按照该层次结构顺序进行。
  • 使用reindex通过fill_value参数创建缺少的行。
  • 最后,重命名索引级别。