У меня есть таблица с пользователями и временем их действий:
Мой алгоритм включает в себя цикл по уникальным значениям и выполнение некоторых действий с использованием функции сдвига.
users = df.user_id.unique()
df_2 = pd.DataFrame(columns = ...) # empty DataFrame
for user in users:
df_new = df[df.user_id == user]
df_new['...'] = df['user_action'].shift(1)....
\ some actions using shift \
df_2 = pd.concat([df_2, df_new])
Кроме того, используются совокупные суммы, поэтому было бы невозможно реализовать алгоритм без разделения на части «df_new».
Этот метод, по-видимому, слишком длинный из-за использования Python «for». Как я могу это сделать, используя встроенные функции Pandas?
Кажется, вы сможете что-то сделать, используя .groupby('user_id')
во-первых, никогда не делайте это в цикле: df_2 = pd.concat([df_2, df_new])
. for
— не самая большая проблема. Это основная проблема. А также выполнение df_new = df[df.user_id == user]
в цикле. Как уже отмечали другие, вы хотите использовать .groupby("user_id")
Не видя полного кода, трудно точно сказать, чего вы пытаетесь достичь.
Но вы смотрели DataFrame.groupby() ? Возвращает объект DataFrameGroupBy , который также предлагает методы shift() и cumsum().
Таким образом, вы сможете переписать свой код, используя groupby()
:
df.groupby(by = "user_id").shift(1).cumsum()
Другим вариантом может быть DataFrameGroupby.apply() , Transform() или агрегат() в зависимости от ожидаемого формата вывода, применяя исходную логику к каждой группе:
def your_actions(df: pd.DataFrame) -> pd.DataFrame:
... # whatever you did for each user
df.groupby(by = "user_id").apply(your_actions)
Вы можете получить более точные ответы, если предоставите более полный пример кода или описание того, что вы пытаетесь вычислить с помощью сдвига и cumsum, но я надеюсь, что это уже поможет, намекая на возможное направление.
Рад это слышать и удачи в программировании :)
как выглядит ваш ожидаемый результат?