Прежде всего, я не уверен, что это правильное название. Не стесняйтесь предложить лучший вариант.
Это мой 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)






Можешь попробовать:
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
как ты получил 100 в столбце b?