Pandas Reverse Groupby Cumprod

#python #pandas

#python #панды

Вопрос:

Я пытаюсь установить столбец как обратный cumprod серии после группировки в другой серии во фрейме данных.

 Attempt 1:
temp_data["factor_price"] = temp_data["factor_price"].groupby("stock_key").cumprod()[::-1]
Attempt 2:
temp_data["factor_price"] = temp_data.groupby("stock_key")["factor_price"].cumprod()[::-1]
Attempt 3: 
temp_data["factor_price"] = temp_data.groupby("stock_key")["factor_price"][::-1].cumprod()
 
 input: temp_data = pd.DataFrame([x, x, x, y, y, y], [1, 2, 3, 0, 1, 2], columns=[
"stock_key", "factor_price"])

Output: Pd.Series(6, 6, 3, 0, 2, 2)
 

Я много исследовал, и я думаю, что мог бы сделать это, если бы перебирал группы, но это исключительно большой набор данных, и я хотел бы максимально упростить код. Есть ли шанс, что это может быть однострочник?

Спасибо!

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

1. Привет и добро пожаловать в SO! Всегда рекомендуется добавлять воспроизводимый пример при задании вопросов, чтобы у вас было больше шансов получить ответы. Попробуйте включить образец ваших данных, а также желаемый результат.

2. Ваш second attempt был на самом деле довольно близок. Все, что вам нужно было сделать, это для начала перевернуть сам набор данных :). проверьте мой ответ на то же самое.

Ответ №1:

итак, мне нужно было применить пользовательскую функцию, которая выполняла cumprod, а затем преобразовать все в список из-за несовместимости индексов с исходным фреймом данных.

 temp_data["factor_price"] = temp_data.groupby("stock_key")["factor_price"].apply(lambda x: 
x[::-1].cumprod()[::-1]).to_list()
 

Ответ №2:

Вы можете сделать это без lambda функции как —

 temp_data[::-1].groupby('stock_key')['factor_price'].cumprod()[::-1]
 

Первый [::-1] изменяет порядок строк набора данных на ожидаемый cumprod() , а второй возвращает его обратно, чтобы вернуть исходный порядок индексов.