Как векторизовать / ускорить группировку / фильтрацию данных в pandas?

#python #pandas #dataframe #pandas-groupby

#python #pandas #dataframe #pandas-groupby

Вопрос:

У меня есть фрейм данных pandas со столбцами «ID», «статус» и «возраст». Конкретный идентификатор имеет несколько строк во фрейме данных, некоторые из них имеют статус 0, а некоторые — статус 1. Я хочу

  1. Отфильтруйте ВСЕ строки тех идентификаторов, в которых нет строк со статусом 1. Например, если ID 5673 содержит десять строк со статусом 0, но нет строк со статусом 1 -> все строки с идентификатором 5673 должны быть удалены.
  2. Сгруппируйте записи по идентификатору и выполните совокупную сумму «возраста». Например, если идентификатор 9873 имеет одну строку со статусом 1 и пять строк со статусом 0 -> Конечный фрейм данных должен содержать только одну строку для идентификатора 9873, а столбец SUM (age) должен содержать сумму всех пятнадцати возрастных записей в исходном фрейме данных для идентификатора 9873.

Вероятно, я мог бы сделать это с помощью цикла for и всего остального, но я видел несколько ответов, в которых говорилось, что это неэффективно и не рекомендуется для pandas. Вместо этого я ищу быструю векторизованную реализацию с использованием некоторой встроенной функции, такой как group by. Мой фрейм данных содержит более 10 ^ 5 строк, поэтому скорость может быть фактором.

Ответ №1:

Попробуйте использовать маски:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas .DataFrame.mask.html

 mask = df["ID"] == 1
print(df[mask])
  

Для агрегации:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas .DataFrame.aggregate.html

Вы можете комбинировать его с масками.