#python #pandas #dataframe
Вопрос:
У меня есть фрейм данных, такой как:
Tag Class A P A Q B P B Q C P C Q C R
Я хочу сгруппироваться по тегу и сохранить первое значение из класса. Однако, если это значение использовалось ранее, найдите следующее значение в теге.
Ожидаемый результат:
Tag Class A P B Q C R
Если для тега не осталось класса, верните значение null (или не включайте тег в вывод).
Я пытался сделать это с помощью drop_duplicates, но безуспешно. Как я могу этого достичь?
Ответ №1:
Мы можем определить пользовательскую функцию , давайте вызовем ее dedupe
, которая поддерживает внутреннее состояние в set
переменной s
для отслеживания ранее использованных классов и возвращает первый доступный класс для каждой группы, которая ранее не использовалась
def dedupe(): s = set() def _dedupe(c): c = c[~c.isin(s)] if len(c) gt; 0: s.add(c.iat[0]) return c.iat[0] return _dedupe df.groupby('Tag', sort=False, as_index=False)['Class'].apply(dedupe())
Tag Class 0 A P 1 B Q 2 C R
Комментарии:
1. Спасибо. Как я могу вернуть класс также в выводе? В настоящее время он, кажется, только возвращает тег
2. @TheloniousMonk Этот результат будет содержать
Tag
, а такжеClass
. Проверьте выводdf.groupby('Tag', as_index=False)['Class'].apply(dedupe())
3. Я проверил еще раз, это только возвращаемый тег, а не класс
4. Я предполагаю, что проблема, похоже, связана с параметром
as_index=False
в старой версии pandas , чтобы исправить это использованиеreset_index
. Уточните уdf.groupby('id', sort=False)['vin'].apply(dedupe()).reset_index()