#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()
, а второй возвращает его обратно, чтобы вернуть исходный порядок индексов.