Сумма внутри столбца pandas
Есть DataFrame из трех столбцов, цена и коэффициенты.
price k1 k2
0 21931.37 0.266667 0.733333
1 21976.18 0.266667 0.733333
2 21983.26 0.266667 0.733333
3 21967.10 0.266667 0.733333
4 21883.39 0.266667 0.733333
Необходимо добавить столбец, значения строк которых будет равен cумме произведения цены с первым коэффициентом и предыдущего значения i1 со вторым коэффициентом
df['i1'] = df['k1']*df["price"] + df['k2']*df['i1'].shift(1)
Приводит к ошибке KeyError: 'i1'.
Если обозначить D['i1'] = 0
price k1 k2 i1
0 21931.37 0.266667 0.733333 NaN
1 21976.18 0.266667 0.733333 5860.314667
2 21983.26 0.266667 0.733333 5862.202667
3 21967.10 0.266667 0.733333 5857.893333
4 21883.39 0.266667 0.733333 5835.570667
Значение равно произведению цены с первым коэффициентом без суммы с предыдущим значением строки. Помогите, только начал вникать в работу с pandas.
Ответы (3 шт):
Вы используете в вычислениях колонку, которой у вас еще нет. разумеется, получаете ошибку.
df["i1"] = (df["price"]*df["k1"]+df["price"]
.shift(1)*df["k1"].shift(1)*df["k2"]).fillna(df["price"]*df["k1"])
df:
price k1 k2 i1
0 21931.37 0.266667 0.733333 5848.372644
1 21976.18 0.266667 0.733333 10149.126648
2 21983.26 0.266667 0.733333 10159.777502
3 21967.10 0.266667 0.733333 10156.852698
4 21883.39 0.266667 0.733333 10131.369823
если хочется уложиться в одну строку, то можно еще вот так "изпитониться":
df.assign(i1=df.price * df.k1).assign(i1=lambda x: x.i1 + x.i1.shift().fillna(0) * x.k2)
>>> out
'''
price k1 k2 i1
0 21931.37 0.266667 0.733333 5848.372644
1 21976.18 0.266667 0.733333 10149.126648
2 21983.26 0.266667 0.733333 10159.777502
3 21967.10 0.266667 0.733333 10156.852698
4 21883.39 0.266667 0.733333 10131.369823
Решил проблему. Создал столбец со значением нуля и перезаписал значение через цикл.
df['i1'] = 0
for i in range(len(df)):
if i == 0:
df.loc[i, 'i1'] = df['price'][i] * df['k1'][i]
if i > 0:
df.loc[i, 'i1'] = df['price'][i] * df['k1'][i] + df['i1'][i-1] * df['k2'][i]