Python: балансирование набора данных для регрессионного анализа (реорганизация набора данных и заполнение пустых категорий) - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть набор данных (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: баланс несбалансированного набора данных (для панельного анализа) :

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

Большое спасибо за вашпомощь

1 Ответ

0 голосов
/ 29 ноября 2018

Используйте это:

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

Подробности:

  • При необходимости используйте уровень свопинга, чтобы получить уровни индекса вправильный порядок.
  • С помощью pd.MultiIndex.from_product уровней индекса можно создавать все комбинации в этом иерархическом порядке.
  • Используйте переиндексацию для создания отсутствующих строк с параметром fill_value.
  • Наконец, переименуйте уровни индекса.
...