Генерация средств комбинаций в многоиндексном фрейме данных (Pandas)

#python #pandas #dataframe #multi-index

#python #pandas #фрейм данных #многоиндексный

Вопрос:

У меня есть многоиндексный фрейм данных, где уровни индекса имеют несколько категорий, что-то вроде этого:

                      |Var1|Var2|Var3|
|Level1|Level2|Level3|----|----|----|
|  A   |  A   |   A  |    |    |    |
|  A   |  A   |   B  |    |    |    |
|  A   |  B   |   A  |    |    |    |
|  A   |  B   |   B  |    |    |    |
|  B   |  A   |   A  |    |    |    |
|  B   |  A   |   B  |    |    |    |
|  B   |  B   |   A  |    |    |    |
|  B   |  B   |   B  |    |    |    |
  

Таким образом, и, в частности, в моем случае, уровень 1 имеет 2 уровня, уровень 2 имеет 24, уровень 3 имеет 6, а также уровни 4 (674) и уровень 5 (9) (с некоторыми незначительными вариациями в зависимости от конкретных значений более высокого уровня — Level1 == 1 фактически имеет 24 уровня 2, но Level1 == 2 имеет23).

Мне нужно сгенерировать все возможные комбинации из 3 на уровне 5, затем вычислить их средние значения для переменных 1-3.

Я пытаюсь сделать что-то вроде этого:

 # Resulting df to be populated
df_result = pd.DataFrame([])
# Retrieving values at Level1
lev1s = df.index.get_level_values("Level1").unique()
# Looping through each Level1 value
for lev1 in lev1s:
   # Filtering df based on Level1 value
   df_lev1 = df.query('Level1 == '   str(lev1))
   # Repeating...
   lev2s = df_lev1.index.get_level_values("Level2").unique()
   for lev2 in lev2s:
      df_lev2 = df_lev1.query('Level2 == '   str(lev2))
      # ... until Level3
      lev3s = df_lev2.index.get_level_values("Level3").unique()
      # Creating all combinations
      combs = itertools.combinations(lev3s, 3)
      # Looping through each combination
      for comb in combs:
         # Filtering values in combination
         df_comb = df_wl.query('Level3 in '   str(comb))
         # Calculating means using groupby (groupby might not be necessary, 
         # but I don't believe it has much of an impact
         df_means = df_comb.reset_index().groupby(['Level1', 'Level2']).mean()
         # Extending resulting dataframe
         df_result = df_result.append(df_means)
  

Дело в том, что через некоторое время этот процесс становится действительно медленным. Поскольку у меня есть 2 * 24 * 6 * 674 уровни и 84 комбинации (из 9 элементов, 3 на 3), я ожидаю, что будет рассчитано более 16 миллионов df_means секунд.

Есть ли более эффективный способ сделать это?

Спасибо.