Я пытаюсь изменить форму следующего кадра данных:
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'])
но я получаю много ошибок. Это лучший способ сделать это?
Первой идеей является использование 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
rename_axis
;)