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

问题描述 投票:1回答:1

我有一个数据集(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)

我正在寻找的OUTPUT是一个平衡表,看起来像这样:

                            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:isna未定义为MultiIndex

非常感谢你的帮助

python pandas dataframe multi-index
1个回答
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参数创建缺少的行。
  • 最后,重命名索引级别。
© www.soinside.com 2019 - 2024. All rights reserved.