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

#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. Большое вам спасибо! Действительно ценю это!