Как я могу увеличить каждую группу на N процентов по сравнению с предыдущей группой?

Прежде всего, я не уверен, что это правильное название. Не стесняйтесь предложить лучший вариант.

Это мой DataFrame:

import pandas as pd
df = pd.DataFrame(
    {
        'a': [100, 100, 102, 102, 106, 106, 106, 107, 107, 107]
    }
)

И это ожидаемый результат. Я хочу создать столбец b:

     a    b
0  100    100  
1  100    100
2  102    103
3  102    103
4  106    106.09
5  106    106.09
6  106    106.09
7  110    110
8  110    110
9  110    110

Процесс выглядит следующим образом:

а) Группы определяются столбцом a.

б) Каждая группа должна быть МИНИМУМ на 3 процента выше предыдущей группы. Это результат столбца b.

Например:

Первая группа — 100. Итак, процесс начинается для следующей группы.

100 * 1,03 = 103

Следующая группа — 102. Она меньше 103. Итак, для b выбрано 103. Теперь следующая группа — 106, так что:

103 * 1,03 = 106,09

106 меньше этого числа, поэтому выбрано 106,09. Для следующей группы начиная с 110 > 106,09 * 1,03 выбирается 110.

Это одна из моих попыток. Но такое ощущение, что это неправильный подход:

df['streak'] = df.a.ne(df.a.shift(1)).cumsum()
df['b'] = df.groupby('streak')['a'].apply(lambda x: x * 1.03)

как ты получил 100 в столбце b?

iBeMeltin 08.05.2024 19:36
Почему в 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
1
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Можешь попробовать:

import pandas as pd


def get_b(a, perc=1.03):
    curr, prev_val = None, None

    for value in a:
        if curr is None:
            curr = value
        elif value != prev_val:
            curr = tmp if value < (tmp := curr * perc) else value
        prev_val = value

        yield curr


df = pd.DataFrame({"a": [100, 100, 102, 102, 106, 106, 106, 110, 110, 110]})
df["b"] = list(get_b(df["a"]))

print(df)

Распечатки:

     a       b
0  100  100.00
1  100  100.00
2  102  103.00
3  102  103.00
4  106  106.09
5  106  106.09
6  106  106.09
7  110  110.00
8  110  110.00
9  110  110.00

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