Как мне найти максимальное значение динамического окна и минимальное значение ниже него?

Это мой DataFrame:

import pandas as pd
df = pd.DataFrame(
    {
        'a': [3, 1, 2, 5, 10, 3, 13, 3, 2],
    }
)

Ожидаемый результат — создание a_max и a_min:

  a  a_max  a_min
0   3    NaN    NaN
1   1      3      1
2   2      3      1
3   5      3      1
4  10      3      1
5   3     10      3
6  13     10      3
7   3     13      3
8   2     13      2

Логика:

Я объясняю логику построчно. Для этого существует динамическое окно df, в котором для первого экземпляра окна рассматривается только первая строка. Для второго экземпляра окна рассматриваются первые две строки. То же, что и ниже:

Это первые четыре окна. Соответственно, он расширяется.

Для каждого окна мне нужно найти максимальное значение, а после этого мне нужно найти минимальное значение НИЖЕ этого максимального значения.

Я начинаю объяснять это из желтого окна. Для этого окна максимальное значение равно 3, а минимальное значение НИЖЕ равно 1. Вот почему a_max и a_min для этого окна равны 3 и 1.

Теперь для оранжевого окна максимальное значение равно 5, но поскольку в этом окне нет значений НИЖЕ этого значения, меньшего 5, предыдущие a_max и a_min повторяются.

И логика продолжается для остальных строк.

Это моя попытка:

df['a_max'] = df.a.cummax()
df['a_min'] = df.a.cummin()

Я немного упростил решение, expanding.min на самом деле просто cummin

mozway 01.08.2024 11:45

@mozway Удивительно, как ты их решаешь. УХ ТЫ.

AmirX 01.08.2024 11:46

Мне чаще всего нравятся ваши вопросы, они, как правило, достаточно сложны, чтобы их было интересно решать, и достаточно общие, чтобы их можно было отнести к SO.

mozway 01.08.2024 11:48

@mozway Для меня большая честь поговорить с тобой :)

AmirX 01.08.2024 11:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это сложный вопрос, я бы использовал сдвиг cummax + , затем маску + ffill для вычисления a_max. Тогда a_min — это groupby.cummin на группу идентичных a_max:

# compute the shifted cummax
cm = df['a'].cummax().shift()

# a_max is the cummax except if the current row is larger
df['a_max'] = cm.mask(df['a'].gt(cm)).ffill()

# a_min is the cummin of the current group of a_max
df['a_min'] = df.groupby('a_max')['a'].cummin()

Выход:

    a  a_max  a_min
0   3    NaN    NaN
1   1    3.0    1.0
2   2    3.0    1.0
3   5    3.0    1.0
4  10    3.0    1.0
5   3   10.0    3.0
6  13   10.0    3.0
7   3   13.0    3.0
8   2   13.0    2.0

Промежуточные продукты:

    a  a_max  cummax  shift  mask  ffill  a_min
0   3    NaN       3    NaN   NaN    NaN    NaN
1   1    3.0       3    3.0   3.0    3.0    1.0
2   2    3.0       3    3.0   3.0    3.0    1.0
3   5    3.0       5    3.0   NaN    3.0    1.0
4  10    3.0      10    5.0   NaN    3.0    1.0
5   3   10.0      10   10.0  10.0   10.0    3.0
6  13   10.0      13   10.0   NaN   10.0    3.0
7   3   13.0      13   13.0  13.0   13.0    3.0
8   2   13.0      13   13.0  13.0   13.0    2.0

Другие вопросы по теме

Похожие вопросы

Как изменить цвет определенного слова пользователя в «input()»
C-расширение Python с numpy случайно аварийно завершает работу после нескольких вызовов (5–10) из кода Python
Создайте фабрику виджетов в Qt
Почему GEKKO не предоставляет оптимальные команды, хотя выходные данные не соответствуют эталонным?
Java sshtools сгенерировал подпись EDDSA, не совпадающую с сгенерированной подписью пикриптома Python
Как записать атрибуты каждого экземпляра в переменную класса, при этом родительский класс записывает экземпляры всех классов в одну и ту же переменную?
Создание динамического массива numpy с использованием двух существующих массивов
Функция C++ возвращает результат очень медленно, намного медленнее, чем функционально эквивалентный код Python
Добавление переменного отступа перед каждой строкой вывода журнала Python
Как извлечь регулярное выражение с переменной из строки в пандах?