Я хотел бы применить решение от здесь к следующему кадру данных:
city date pct id price
0 bj 2019-06-01 0.010002 1210217342 NaN
1 bj 2019-07-01 0.009999 1210217342 NaN
2 bj 2019-08-01 0.009996 1210217342 NaN
3 bj 2019-09-01 0.010000 1210217342 NaN
4 bj 2019-10-01 0.010000 1210217342 NaN
5 bj 2019-11-01 0.000000 1210217342 NaN
6 bj 2019-12-01 0.002683 1210217342 NaN
7 bj 2020-01-01 -0.012374 1210217342 NaN
8 bj 2020-02-01 -0.018702 1210217342 35000.0
Когда я использую код ниже, я получаю правильный результат:
df.fillna({'price':1})\
.groupby('id')\
.apply(lambda x: (x['price']/(1 + x['pct'].shift(-1).fillna(0)))[::-1].cumprod()[::-1])\
.reset_index(level=0, drop=True)
Вывод:
0 1 ... 7 8
0 34612.079278 34958.180065 ... 35667.054491 35000.0
Но когда я установил для них значение price
,
df['price'] = (df.fillna({'price':1})\
.groupby('id')\
.apply(lambda x: (x['price']/(1 + x['pct'].shift(-1).fillna(0)))[::-1].cumprod()[::-1])\
.reset_index(level=0, drop=True))
print(df)
Кажется, это не сработало, потому что некоторые все еще NaN
s :
city date pct id price
0 bj 2019-06-01 0.010002 1210217342 34612.079278
1 bj 2019-07-01 0.009999 1210217342 NaN
2 bj 2019-08-01 0.009996 1210217342 NaN
3 bj 2019-09-01 0.010000 1210217342 NaN
4 bj 2019-10-01 0.010000 1210217342 NaN
5 bj 2019-11-01 0.000000 1210217342 NaN
6 bj 2019-12-01 0.002683 1210217342 NaN
7 bj 2020-01-01 -0.012374 1210217342 NaN
8 bj 2020-02-01 -0.018702 1210217342 NaN
Или, если я попытаюсь создать новый столбец new_price
с ним:
df['new_price'] = (df.fillna({'price':1})\
.groupby('id')\
.apply(lambda x: (x['price']/(1 + x['pct'].shift(-1).fillna(0)))[::-1].cumprod()[::-1])\
.reset_index(level=0, drop=True))
, он выдаст ошибку: ValueError: Wrong number of items passed 9, placement implies 1
.
Кстати, при наличии нескольких групп city
и id
приведенный выше код работает без сбоев.
Кто-нибудь может помочь мне решить эту проблему? Спасибо.