#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
секунд.
Есть ли более эффективный способ сделать это?
Спасибо.