Как избежать цикла в Pandas, повторяющего уникальные значения?

У меня есть таблица с пользователями и временем их действий:

ID пользователя время user_action пользователь_1 1 действие_1 пользователь_2 2 действие_2 пользователь_1 3 действие_3 пользователь_2 4 действие_4

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


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?

как выглядит ваш ожидаемый результат?

iBeMeltin 24.06.2024 19:33

Кажется, вы сможете что-то сделать, используя .groupby('user_id')

Barmar 24.06.2024 19:35

во-первых, никогда не делайте это в цикле: df_2 = pd.concat([df_2, df_new]). for — не самая большая проблема. Это основная проблема. А также выполнение df_new = df[df.user_id == user] в цикле. Как уже отмечали другие, вы хотите использовать .groupby("user_id")

juanpa.arrivillaga 24.06.2024 21:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не видя полного кода, трудно точно сказать, чего вы пытаетесь достичь.

Но вы смотрели 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, но я надеюсь, что это уже поможет, намекая на возможное направление.

Рад это слышать и удачи в программировании :)

Valentin Kuhn 24.06.2024 20:15

Другие вопросы по теме

Как исправить столбец с числовыми значениями, который воспринимается как строковое поле из-за пустых строк в фрейме данных Pandas?
Добавьте значения двух Dataframe на основе похожих значений строк
С помощью Python извлеките в файл Excel значение ячейки в строке, где ячейка в той же строке содержит строку символов из XML-файла
Обмен датой начала, датой окончания и другими столбцами с более ранней строкой, если даты больше 8 в фрейме данных pandas
Как я могу сравнить значение в одном столбце со всеми значениями, которые находятся ДО него в другом столбце, чтобы найти количество уникальных значений, которые меньше?
Присоединиться к фрейму данных с двойной записью
Получите минимум за счет итераций записи в фрейме данных pandas
Добавьте количество строк в виде списка в столбец, используя groupby
Сохраните данные на новой вкладке в файле .xlsx
Pandas groupby — группировать столбцы в список количества значений строк

Похожие вопросы

Mlflow не регистрирует артефакты автоматически при регистрации изображений
Модель одноголового трансформатора, размеры выходного и целевого тензоров не совпадают
Дополнение до определенного уровня и добавление символа в конце
Расширение Python GDB: я пытаюсь получить вызывающую строку и информацию о файле для вызова макроса, но получаю неправильные значения из-за комментариев
Аутентификация ManagedIdentityCredential недоступна. Запрошенный идентификатор не был назначен этому ресурсу
Использование REST API в Python для запуска рабочих процессов в Azure Purview
Как исправить столбец с числовыми значениями, который воспринимается как строковое поле из-за пустых строк в фрейме данных Pandas?
Как оценить цвет изображения Pyplot в данной точке?
Возможно ли иметь встроенное определение класса данных в Python?
Добавьте значения двух Dataframe на основе похожих значений строк