python pandas: удалите дубликаты по столбцам A, сохраняя строку с самым высоким значением в столбце B
у меня есть фрейм данных с повторяющимися значениями в столбце 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 достаточно хорошо, чтобы понять это. Есть предложения?
8 ответов:
это занимает последнее. Не максимум, хотя:
In [10]: df.drop_duplicates(subset='A', keep="last") Out[10]: A B 1 1 20 3 2 40 4 3 10Вы можете сделать также что-то вроде:
In [12]: df.groupby('A', group_keys=False).apply(lambda x: x.loc[x.B.idxmax()]) Out[12]: A B A 1 1 20 2 2 40 3 3 10
верхний ответ делает слишком много работы и выглядит очень медленно для больших наборов данных.
applyмедленно, и его следует избегать, если это возможно.ixявляется устаревшим и его также следует избегать.df.sort_values('B', ascending=False).drop_duplicates('A').sort_index() A B 1 1 20 3 2 40 4 3 10или просто сгруппируйте все остальные столбцы и возьмите максимум столбца, который вам нужен.
df.groupby('A', as_index=False).max()
вы можете попробовать это также
df.drop_duplicates(subset='A', keep='last')Я сослался на это из https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html
Я думаю, что в вашем случае вам действительно не нужен groupby. Я бы отсортировал по убыванию ваш столбец B, а затем отбросил дубликаты в столбце A, и если вы хотите, у вас также может быть новый хороший и чистый индекс вот так:
df.sort_values('B', ascending=False).drop_duplicates('A').sort_index().reset_index(drop=True)
это также работает:
a=pd.DataFrame({'A':a.groupby('A')['B'].max().index,'B':a.groupby('A') ['B'].max().values})
когда уже заданные сообщения отвечают на вопрос, я внес небольшое изменение, добавив имя столбца, к которому применяется функция max() для лучшей читаемости кода.
df.groupby('A', as_index=False)['B'].max()
Я не собираюсь давать вам полный ответ (я не думаю, что вы ищете разбор и запись в файл часть в любом случае), но ключевой намек должен быть достаточным: используйте python's
Comments