Сначала преобразуйте DATE
в дату и измените на DataFrame.set_index
с Series.unstack
, для месяцев используйте Series.dt.strftime
. Последнее изменение порядка имен столбцов на DataFrame.reindex
и удаление имен столбцов индекса namd на DataFrame.rename_axis
:
df['DATE'] = pd.to_datetime(df['DATE'])
m = ['Jan', 'Feb', 'Mar', 'Apr','May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
df1 = (df.set_index([df['DATE'].dt.year, df['DATE'].dt.strftime('%b')])['VAL']
.unstack(fill_value=0)
.reindex(columns=m)
.rename_axis(index=None, columns=None))
print (df1)
Jan Feb Mar Apr May Jun Jul \
2007 0.000000 0.000000 0.000000 0.000000 0.000000 0.008530 -0.067069
2008 -0.059951 -0.033422 0.008978 0.039997 0.043563 -0.076166 0.000000
Aug Sep Oct Nov Dec
2007 0.02666 0.016237 0.025145 -0.063666 -0.002118
2008 0.00000 0.000000 0.000000 0.000000 0.000000
Другое решение - использовать DataFrame.pivot
и для правильного упорядочения используется упорядоченный категориальный с:
df['DATE'] = pd.to_datetime(df['DATE'])
m = ['Jan', 'Feb', 'Mar', 'Apr','May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
df1 = (df.assign(m = pd.Categorical(df['DATE'].dt.strftime('%b'), ordered=True, categories=m),
y = df['DATE'].dt.year)
.pivot('y','m','VAL')
.fillna(0)
.rename_axis(index=None, columns=None))
print (df1)
Jan Feb Mar Apr May Jun Jul \
2007 0.000000 0.000000 0.000000 0.000000 0.000000 0.008530 -0.067069
2008 -0.059951 -0.033422 0.008978 0.039997 0.043563 -0.076166 0.000000
Aug Sep Oct Nov Dec
2007 0.02666 0.016237 0.025145 -0.063666 -0.002118
2008 0.00000 0.000000 0.000000 0.000000 0.000000
Решение с rename
столбцами:
d = {1: 'Jan', 2: 'Feb', 3: 'Mar', 4: 'Apr', 5: 'May', 6: 'Jun',
7: 'Jul', 8: 'Aug', 9: 'Sep', 10: 'Oct', 11: 'Nov', 12: 'Dec'}
df1 = (df.set_index([df.index.year, df.index.month]).VAL
.unstack(fill_value=0)
.rename(columns=d))