Как повернуть вектор в Python - PullRequest
2 голосов
/ 15 октября 2019

У меня есть следующий примерный фрейм данных:

index = pd.date_range('1/1/2020', periods=8760, freq='H')
df = pd.Series(range(8760), index=index)

Что я хотел бы сделать, это иметь новый фрейм данных, который для столбца будет иметь номера дней от 1 до 31 и для строк, этобудет иметь все месяцы, начиная с первого доступного месяца от df до последнего доступного месяца. Также должны быть месяцы, даже если они не включены в df.

Вывод должен выглядеть следующим образом:

enter image description here

InВ ячейках результата должны быть либо средние значения, либо суммы значений.

Например, первая ячейка (01-20,1) должна иметь среднее значение всех значений первого дня за первый месяц, последний столбец и последняя ячейка (12-20,31) должныесть среднее значение всех значений за последний день этого месяца и т. д.

Я пытался работать с группой, но не повезло.

1 Ответ

3 голосов
/ 15 октября 2019

Вы хотите pivot_table с days и months:

# your data is a series, we turn it to a dataframe
df = df.to_frame(name='values')

# create days and months
df['days'] = df.index.day
df['months'] = df.index.to_period('M')

# since your data is hourly, I just take daily mean:
df.pivot_table(columns='days', 
               index='months', 
               values='values', 
               aggfunc='mean')

Вы также можете использовать groupby без преобразования серии в кадр:

(df.groupby([df.index.day, df.index.to_period('M')])
   .mean()
   .unstack(0)
)
...