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 достаточно хорошо, чтобы понять это. Есть предложения?

1696   8  

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.groupby(['A']).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

    Ничего не найдено.