#python #pandas #dataframe #pandas-groupby
#python #pandas #dataframe #pandas-groupby
Вопрос:
У меня есть фрейм данных pandas со столбцами «ID», «статус» и «возраст». Конкретный идентификатор имеет несколько строк во фрейме данных, некоторые из них имеют статус 0, а некоторые — статус 1. Я хочу
- Отфильтруйте ВСЕ строки тех идентификаторов, в которых нет строк со статусом 1. Например, если ID 5673 содержит десять строк со статусом 0, но нет строк со статусом 1 -> все строки с идентификатором 5673 должны быть удалены.
- Сгруппируйте записи по идентификатору и выполните совокупную сумму «возраста». Например, если идентификатор 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
Вы можете комбинировать его с масками.