Проблемы, изменяющие структуру данных в python: pivot и groupby не работают

1

Я пытаюсь изменить форму следующего кадра данных:

            year    production     diversity
code_city           
10701       2007    1096895.118        97
10701       2008    1485981.356       101
10701       2009    1592737.910       110
10702       2007    1196895.116        95
10702       2008    1285981.355       102
10702       2009    1392737.913       111
10703       2007    1496895.112        92
10703       2008    1585981.351       105
10703       2009    1692737.916       116

и требуемый выход:

                         production    diversity    

10701       2007-12-31  1096895.118        97
            2008-12-31  1485981.356       101
            2009-12-31  1592737.910       110
10702       2007-12-31  1196895.116        95
            2008-12-31  1285981.355       102
            2009-12-31  1392737.913       111
10703       2007-12-31  1496895.112        92
            2008-12-31  1585981.351       105
            2009-12-31  1692737.916       116

Я использовал это:

table = pd.pivot_table(df_firms1, index=['code_city', 'year'], columns=['production', 'diversity'])

но я получаю много ошибок. Это лучший способ сделать это?

Теги:
pandas
python-3.x
pandas-groupby
pivot

1 ответ

3
Лучший ответ

Первой идеей является использование reset_index:

table = pd.pivot_table(df_firms1.reset_index(), 
                       index=['code_city', 'year'], 
                       columns=['production', 'diversity'])

Но с образцами данных:

DataError: нет числовых типов для агрегирования

Поэтому нужно преобразовать year column в datetimes, а затем set_index с параметром append=True для MultiIndex с rename_axis для удаления имен индексов:

df_firms1['year'] = pd.PeriodIndex(df_firms1['year'], freq='A').to_timestamp(how='e')

#alternative solution
#df_firms1['year'] = pd.to_datetime(df_firms1['year'], format='%Y') + pd.offsets.YearEnd()

df_firms1 = df_firms1.set_index('year', append=True).rename_axis([None, None])
print (df_firms1)

                   production  diversity
10701 2007-12-31  1096895.118         97
      2008-12-31  1485981.356        101
      2009-12-31  1592737.910        110
10702 2007-12-31  1196895.116         95
      2008-12-31  1285981.355        102
      2009-12-31  1392737.913        111
10703 2007-12-31  1496895.112         92
      2008-12-31  1585981.351        105
      2009-12-31  1692737.916        116
  • 0
    это работает! ... но как я могу стереть имена индексов: 'code_city' и 'year'? @jazrael.
  • 1
    @PAstudilloE - Добавлена функция rename_axis ;)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню