#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
У меня есть набор данных, который содержит многоиндексные столбцы с первым уровнем, состоящим из года, разделенного на четыре квартала. Как мне структурировать индекс так, чтобы в каждом квартале было 4 набора месяцев?
Я нашел следующий фрагмент кода в stack overflow:
index = pd.MultiIndex.from_product([['S1', 'S2'], ['Start', 'Stop']])
print pd.DataFrame([pd.DataFrame(dic).unstack().values], columns=index)
это дало следующий результат:
S1 S2
Start Stop Start Stop
0 2013-11-12 2013-11-13 2013-11-15 2013-11-17
Однако это не могло решить мое требование о наличии разных наборов месяцев в каждом квартале года.
Мои данные выглядят так:
2015
Q1 Q2 Q3 Q4
Country jan Feb March Apr May Jun July Aug Sep Oct Nov Dec
India 45 54 34 34 45 45 43 45 67 45 56 56
Canada 44 34 12 32 35 45 43 41 60 43 55 21
Я хочу ввести ту же структуру набора данных в pandas с определенным набором месяцев в каждом квартале. Как мне это сделать?
Ответ №1:
Вы также можете создать a MultiIndex
несколькими другими способами. Один из них, который полезен, если у вас сложная структура, заключается в ее построении из явного набора кортежей, где каждый кортеж представляет собой один иерархический столбец. Ниже я сначала создаю все необходимые вам кортежи формы (year, quarter, month)
, создаю MultiIndex
из них, а затем назначаю их в качестве столбцов фрейма данных.
import pandas as pd
year = 2015
months = [
("Jan", "Feb", "Mar"),
("Apr", "May", "Jun"),
("Jul", "Aug", "Sep"),
("Oct", "Nov", "Dec"),
]
tuples = [(year, f"Q{i 1}", month) for i in range(4) for month in months[i]]
multi_index = pd.MultiIndex.from_tuples(tuples)
data = [
[45, 54, 34, 34, 45, 45, 43, 45, 67, 45, 56, 56],
[44, 34, 12, 32, 35, 45, 43, 41, 60, 43, 55, 21],
]
df = pd.DataFrame(data, index=["India", "Canada"], columns=multi_index)
df
# 2015
# Q1 Q2 Q3 Q4
# Jan FebMar Apr May Jun Jul Aug Sep Oct Nov Dec
# India 45 54 34 34 45 45 43 45 67 45 56 56
# Canada 44 34 12 32 35 45 43 41 60 43 55 21
Комментарии:
1. Спасибо! Еще один вопрос: если бы я хотел передать список лет с 2015 по 2019 год в том же коде и отобразить четыре квартала для каждого из этих лет, как бы я включил это в приведенный выше код?
2. Вы могли бы сделать
years = range(2015, 2020)
и тогдаtuples = [(year, f"Q{i 1}", month) for year in years for i in range(4) for month in months[i]]
. Вам также потребуется обновлениеdata
, потому что теперь у вас будет в 4 раза больше столбцов, поэтому в каждой строке должно быть в 4 раза больше элементов.3. Большое вам спасибо! Действительно ценю это!