Python Pandas Group Рекурсия - PullRequest
       7

Python Pandas Group Рекурсия

0 голосов
/ 15 сентября 2018

Вопрос, который у меня есть, тесно связан с этой записью. Предположим, у меня есть следующий набор данных:

df = pd.DataFrame({"A":range(1,10), "B":range(5,14), "Group": 
[1,1,2,2,2,2,3,3,3],"C":[0,0,10,0,0,16,0,0,22], "last":[0,1,0,0,0,1,0,0,1], 
"Want": [19.25,8,91.6,71.05,45.85,16,104.95,65.8,22]})

Последнее наблюдение за группой прямо. Вот как выглядит код:

def calculate(df):
if (df.last == 1):
    value = df.loc["A"] + df.loc["B"]
else:

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

value = (df.loc[i-1, "C"] + 3 * df.loc[i, "A"] + 1.65 * df.loc[i, "B"])
    return value

Для дальнейшего уточнения, это формулы для расчета столбца Want для группы 2 с использованием excel: F4 = "F5 + (3 * A4) + (1.65 * B4)", F5 = "F6 + (3 * A5) + ( 1,65 * B5) ", F6 =" F7 + (3 * A6) + (1,65 * B6) ", F7 =" A7 + B7 ". В этом есть какая-то «рекурсивная» природа, поэтому я подумал о «цикле for»

Я бы очень признателен за решение, в котором оно согласуется с первым утверждением if. Это

value = something

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

df["value"] = df.apply(calculate, axis=1)

Ваша помощь приветствуется. Спасибо

1 Ответ

0 голосов
/ 15 сентября 2018

Вам не нужно apply здесь. Обычно apply очень медленный, и вы захотите избежать этого.

Проблемы с этой рекурсивной характеристикой , однако, обычно трудно векторизовать. К счастью, ваши могут быть решены с помощью перевернутых cumsum и np.where

df['Want'] = np.where(df['last'] == 1, df['A'] + df['B'], 3*df['A'] + 1.65*df['B'])
df['Want'] = df[::-1].groupby('Group')['Want'].cumsum()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...