Итеративно подмножествовать и вычислять средства фрейма данных pandas

#python #pandas

Вопрос:

У меня довольно большой фрейм данных (~30 тыс. строк, ~30 тыс. столбцов), для которого я пытаюсь итеративно создать два подмножества на основе значений каждого столбца и сохранить массивы коэффициентов для каждого столбца:

 
for col in df.columns:
    high_subset = df.query(col>cutoff_vals['high'][col]).mean(axis=0)
    low_subset = df.query(col<cutoff_vals['low'][col]).mean(axis=0)
    ratios = high_subset / low_subset
    ///
    store_ratios_for_col

 

У меня есть значения low_cutoff и high_cuttoff , предварительно вычисленные и сохраненные в словаре cutoff_vals . Я хотел бы иметь возможность хранить ratio массив для каждого столбца, что должно привести к массиву NxN соотношений (N == количество столбцов).

Существует ли более эффективный метод для перебора столбцов, их подмножества и выполнения математических вычислений/сравнений в серии результатов?

Я понимаю, что использование чего-то вроде Dask или Ray-проекта может помочь, но сначала подумал, что может быть умная векторизация или встроенный трюк с пандами.

Ответ №1:

Используйте gt для сравнения всех столбцов, а затем .where для маскировки:

 cutoffs = pd.DataFrame(cutoff_vals)

highs = df.where(df.gt(cutoffs['high'])).mean()
lows = df.where(df.lt(cutoffs['low'])).mean()

# ratios for all columns
# get any with ratios[col_name]
ratios = highs / lows
 

Комментарии:

1. Это сохраняет высокое/низкое соотношение для каждого подмножества, но сводится только к соотношению для данного столбца. Есть ли способ отредактировать это, чтобы я мог сохранить массив коэффициентов для каждого подмножества? Я представляю, что это должен быть массив NxN вместо одномерного массива.

2. Возможно, вам следует добавить пример данных и ожидаемый результат к вашему вопросу.

3. Мои извинения, я обновил вопрос с ожидаемым результатом.