Пример набора данных (выход — желаемый результат).
Код: Выделить всё
idx week slug valuation output
0 2 slouk -4 12.00
1 3 slouk 7 4.00
2 4 slouk 8 5.00
3 3 kenun 10 14.00
4 1 kenun 11
5 1 slouk 12
6 2 kenun 17 11.00
7 4 kenun 21 12.67
Код: Выделить всё
# chaining
td["output"] = (
td.sort_values(by="week")
.groupby("slug")["valuation"]
.shift()
.expanding()
.mean()
.reset_index(drop=True)
)
# apply
td["output"] = (
td.sort_values(by="week")
.groupby("slug")["valuation"]
.apply(lambda x: x.shift().expanding().mean())
.reset_index(drop=True)
)
Итак, теперь это работает :
Код: Выделить всё
td["output"] = (
td.sort_values(by="week")
.groupby("slug")["valuation"]
.apply(lambda x: x.shift().expanding().mean())
.sort_index(level=1)
.reset_index(drop=True)
)
Хотя это работает, у меня все еще есть несколько моментов, которые я' хотелось бы лучше понять:
- Проблема цепочки методов: когда я использую цепочку методов, например td.groupby('slug')['valuation'].shift().expanding().mean(), похоже, после определенного момента он теряет контроль над группировкой. Я не понимаю, почему это происходит и чем оно отличается от использования apply.
- Индексирование и присвоение с помощью apply: использование apply с лямбда-функцией выполняет операцию правильно, но порядок полученной серии отличается от моего исходного DataFrame. Когда я пытаюсь назначить его обратно с помощью .reset_index(drop=True), все выравнивается неправильно. Мне нужна ясность в отношении того, как работает этот процесс переназначения.
- Есть ли другой, более эффективный способ сделать то, что мне нужно?< /p>
Подробнее здесь: https://stackoverflow.com/questions/793 ... ng-current