У меня есть блок данных с временными рядами по 25 портфелям (ME1_BM1, ME1_BM2 и т.д.), Наблюдаемый ежемесячно с 1932-02-29 по 2018-07-31. Первые четыре наблюдения выглядят так:
ME1_BM1 ME1_BM2 ...
Date
1932-02-29 2.11875 1.28388
1932-03-31 2.18567 1.24275
...
Столбец Date установлен как индекс. Мне нужно подготовить данные для чего-то другого, поэтому мне нужно преобразовать данные в следующее:
ME1_BM1 1932-02-29 2.11875
1932-03-31 2.18567
...
ME1_BM2 1932-02-29 1.28388
1932-03-31 1.24275
...
Не могу заставить его работать. Я попытался сфотографировать фреймворк данных, но затем я получаю индекс Date и индекс как вторую "переменную". Я не получил нигде с pivot, поскольку мне нужно было указать слишком много переменных...
Кто-нибудь знает, как это сделать, пожалуйста?
С уважением, Йеспер.
Я думаю, вам нужно unstack
для Series
с MultiIndex
:
s = df.unstack()
print (s)
Date
ME1_BM1 1932-02-29 2.11875
1932-03-31 2.18567
ME1_BM2 1932-02-29 1.28388
1932-03-31 1.24275
dtype: float64
Если хотите 3 столбца DataFrame
добавьте reset_index
:
df1 = df.unstack().reset_index()
df1.columns = ['portfolio','date','val']
print (df1)
portfolio date val
0 ME1_BM1 1932-02-29 2.11875
1 ME1_BM1 1932-03-31 2.18567
2 ME1_BM2 1932-02-29 1.28388
3 ME1_BM2 1932-03-31 1.24275
Хотя предыдущий ответ более изящный, вы можете сделать следующее:
df = df.reset_index() # so date is not index anymore
Расплавьте портфели:
df2 = pd.melt(df, id_vars=["Date"], value_vars=['ME1_BM1','ME1_BM2'])
Применить groupby:
df2.groupby(["variable", "Date"])["value"].max()
Очевидно, вы можете изменить имена столбцов, чтобы они выглядели немного более аккуратными.
Также вы можете просто собрать все свои столбцы с помощью df.columns
удалите дату, а затем вам не нужно вводить слишком много.