У меня есть фрейм данных с повторяющимися значениями в столбце A. Я хочу удалить дубликаты, сохранив строку с самым высоким значением в столбце B.
Итак, это:
A B
1 10
1 20
2 30
2 40
3 10
Должен превратиться в это:
A B
1 20
2 40
3 10
Уэс добавил несколько приятных функций для удаления дубликатов: http://wesmckinney.com/blog/?p=340 . Но AFAICT, он предназначен для точных дубликатов, поэтому нет упоминания о критериях выбора, какие строки будут сохранены.
Я предполагаю, что, вероятно, есть простой способ сделать это - возможно, такой же простой, как сортировка кадра данных перед удалением дубликатов - но я недостаточно хорошо знаю внутреннюю логику groupby, чтобы понять это. Какие-либо предложения?
Ответы:
Это занимает последнее. Не максимум, хотя:
Вы также можете сделать что-то вроде:
источник
cols
иtake_last
параметры амортизации и были замененыsubset
иkeep
параметрами. pandas.pydata.org/pandas-docs/version/0.17.1/generated/…FutureWarning: the take_last=True keyword is deprecated, use keep='last' instead
df.sort_values(by=['B']).drop_duplicates(subset=['A'], keep='last')
? Я имею в виду, что sort_values мне кажется безопасным, но я понятия не имею, так ли это на самом деле.group_by
, вы можете добавить.reset_index(drop=True)
df.groupby(['A','C'], group_keys=False).apply(lambda x: x.ix[x.B.idxmax()]).reset_index(drop=True)
Это сбросит индекс, поскольку его значением по умолчанию будет Multindex, составленный из'A'
и'C'
Лучший ответ - это слишком много работы, и он выглядит очень медленным для больших наборов данных.
apply
медленный и его следует избегать, если это возможно.ix
устарела и ее следует избегать.Или просто сгруппируйте по всем другим столбцам и возьмите максимум нужного столбца.
df.groupby('A', as_index=False).max()
источник
lamba
функции при отбрасывании. Например, как я могу отбросить только значения, меньшие, чем, скажем, среднее из этих повторяющихся значений.Самое простое решение:
Чтобы удалить дубликаты на основе одного столбца:
Чтобы удалить дубликаты на основе нескольких столбцов:
источник
Попробуй это:
источник
Я бы отсортировал данные сначала по убыванию столбца B, затем удалил дубликаты для столбца A и оставил первым
без какой-либо групповой
источник
Вы также можете попробовать это
Я сослался на это по адресу https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html.
источник
Я думаю, что в вашем случае вам не нужна групповая игра. Я бы отсортировал в порядке убывания ваш столбец B, затем удалил дубликаты в столбец A, и если вы хотите, у вас также может быть новый красивый и чистый индекс:
источник
Вот вариант, который мне нужно было решить, который стоит поделиться: для каждой уникальной строки в
columnA
я хотел найти наиболее распространенную связанную строкуcolumnB
.df.groupby('columnA').agg({'columnB': lambda x: x.mode().any()}).reset_index()
.any()
Выбирает один , если есть связь для режима. (Обратите внимание, что использование.any()
для Seriesint
возвращает логическое значение вместо выбора одного из них.)Для первоначального вопроса соответствующий подход упрощает
df.groupby('columnA').columnB.agg('max').reset_index()
,источник
Когда уже заданные сообщения отвечают на вопрос, я внес небольшое изменение, добавив имя столбца, к которому применяется функция max () для лучшей читаемости кода.
источник
Самый простой способ сделать это:
источник
это также работает:
источник
Я не собираюсь давать вам полный ответ (я не думаю, что вы все равно ищете синтаксический анализ и запись в файловую часть), но ключевой подсказки должно быть достаточно: используйте
set()
функцию python , а затемsorted()
или в.sort()
сочетании с.reverse()
:источник