#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. Мои извинения, я обновил вопрос с ожидаемым результатом.