#python #python_3x #pandas #dataframe
Подскажите, как правильнее скользящим окном пройтись по датафрейму для нескольких столбцов? Окно например 3х3. Я хочу вычислять максимум из значений попадающих в это окно и записать их в новый столбец. Вот мой код в несколько действий: x = pd.Series([1, 4, 3, 2, 1, 6, 2, 8, 3, 0, 1, 2, 1, 5]) df = pd.DataFrame({"A": x**2+8, "B": x*8, "C": x+34}) df[['maxA','maxB','maxC']] = df.loc[:,'A':'C'].rolling(3).max() df['Max_ABC'] = df.loc[:,['maxA','maxB','maxC']].max(axis=1) df Сейчас я использую промежуточное вычисление как на рисунке, используя столбцы ['maxA','maxB','maxC'] только для получения промежуточного результата. Мне видится что это лишний шаг вычисления, и наверное есть более простой способ решения. Знаете ли более пандовский метод для работы со скользящим окном, чтобы получить сразу нужный столбец как на рисунке ниже?
Ответы
Ответ 1
In [46]: df['Max_ABC'] = df[['A','B','C']].rolling(3).max().max(axis='columns') In [47]: df Out[47]: A B C Max_ABC 0 9 8 35 NaN 1 12 16 36 NaN 2 17 24 37 37.0 3 24 32 38 38.0 4 33 40 39 40.0 5 44 48 40 48.0 6 57 56 41 57.0 7 72 64 42 72.0 Пояснение: df[['A','B','C']].rolling(3).max() - возвращает максимумы в скользящем окне для всех указанных столбцов: In [51]: df[['A','B','C']].rolling(3).max() Out[51]: A B C 0 NaN NaN NaN 1 NaN NaN NaN 2 17.0 24.0 37.0 3 24.0 32.0 38.0 4 33.0 40.0 39.0 5 44.0 48.0 40.0 6 57.0 56.0 41.0 7 72.0 64.0 42.0 далее мы выбираем максимум для каждой строки, указав axis='columns': In [52]: df[['A','B','C']].rolling(3).max().max(axis='columns') Out[52]: 0 NaN 1 NaN 2 37.0 3 38.0 4 40.0 5 48.0 6 57.0 7 72.0 dtype: float64
Комментариев нет:
Отправить комментарий