Python — Группируйте по столбцам, выбирая первое значение из другого столбца, но не в том случае, если значение уже было выбрано

#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()