Преобразование кадра данных nx 1 в сетку размера axb на основе месяца, года - PullRequest
1 голос
/ 28 января 2020

У меня есть pandas фрейм данных с индексом дата-время, который я хотел бы переориентировать как сетку из pandas фрейма данных временного ряда.

Мой фрейм данных выглядит следующим образом:

DATE        VAL         
2007-06     0.008530
2007-07    -0.067069
2007-08     0.026660
2007-09     0.016237
2007-10     0.025145
2007-11    -0.063666
2007-12    -0.002118
2008-01    -0.059951
2008-02    -0.033422
2008-03     0.008978
2008-04     0.039997
2008-05     0.043563
2008-06    -0.076166
...

И я бы хотел переориентировать, с [year] строками и [month] столбцами, чтобы это выглядело так:

      Jan       Feb      Mar    ...  Jun      Jul      Aug      Sep      Oct      Nov      Dec  
2007   0         0        0     ... .008530  -.067069 .026660  .016237  .025145  -.06366  -.025145 
2008  -.05995  -.033422 .00897  ... -.076166   ...
...

Методы reshape / stack / unstack, по-видимому, делают версию, которая мне нравится, но, поскольку у меня есть один индекс даты, они не поддаются моему фрейму данных.

1 Ответ

3 голосов
/ 28 января 2020

Сначала преобразуйте 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...