Цикл фрейма данных, используйте значение из предыдущей строки в качестве нового значения и заполните фрейм данных. проверьте код

#python #pandas #dataframe #function #filtering

Вопрос:

Не могу понять, как создать функцию, которая могла бы взять сумму предыдущей строки и использовать ее в качестве нового значения для следующей строки и повторять ее до конца кадра данных.

Пример: (здесь мы видим 2 значения и его прибыль от A до B в %)

 import pandas as pd
df = pd.DataFrame(data={"A":[4,5,2,2], "B":[5,3,3,4]})
df['Profit_%'] = (df["B"] - df["A"]) / df["A"] * 100
print(df)
 

Функция:

 new_col = 'c'

def apply_func_decorator(func):
    prev_row = {}
    def wrapper(curr_row, **kwargs):
        val = func(curr_row, prev_row)
        prev_row.update(curr_row)
        prev_row[new_col] = val
        return val
    return wrapper
@apply_func_decorator
def running_total(curr_row, prev_row):
    return curr_row['Profit_%'] * prev_row.get(new_col, 0) /100   125
 

Выход:

 df[new_col] = df.apply(running_total, axis=1)
print(df)
 

Таким образом, вопрос будет заключаться в том, как применить функцию, начиная со 2-й строки, и сообщить Python, что начальная сумма для инвестирования составляет 100 долларов?

Итак, в реальной жизни это должно быть так: Мы инвестируем 100$, и с первой строки мы получаем 25% = 125$, Со второй строки мы теряем 40%, и мы теряем их со 125$ > и теперь у нас всего 75$, С третьей строки мы получаем 50%, и это будет: 112,5$ и т. Д.

Ответ №1:

Вы просто увеличиваете отдачу, вы могли бы просто использовать совокупный продукт:

 df["C"] = 100*(df["B"]/df["A"]).cumprod()

>>> df
   A  B      C
0  4  5  125.0
1  5  3   75.0
2  2  3  112.5
3  2  4  225.0
 

Комментарии:

1. Спасибо, что пропустили это. Пробовал несколько раз .cumprod, но использовал его неправильно.