Eu tenho um quadro de dados com valores de repetição na coluna A. Quero eliminar duplicatas, mantendo a linha com o valor mais alto na coluna B.
Então, é isso:
A B
1 10
1 20
2 30
2 40
3 10
Deve se transformar nisso:
A B
1 20
2 40
3 10
Wes adicionou uma funcionalidade interessante para eliminar duplicatas: http://wesmckinney.com/blog/?p=340 . Mas o AFAICT foi desenvolvido para duplicatas exatas, portanto não há menção de critérios para selecionar quais linhas serão mantidas.
Suponho que provavelmente haja uma maneira fácil de fazer isso - talvez tão fácil quanto classificar o quadro de dados antes de eliminar duplicatas -, mas não conheço a lógica interna do groupby o suficiente para descobrir isso. Alguma sugestão?
python
duplicates
pandas
Abe
fonte
fonte
Respostas:
Isso leva o último. Não é o máximo:
Você também pode fazer algo como:
fonte
cols
etake_last
são depreciados e foram substituídos pelos parâmetrossubset
ekeep
. 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')
? Quero dizer que esses valores_de_parte parecem seguros para mim, mas não tenho idéia se realmente é.group_by
, poderá adicionar..reset_index(drop=True)
df.groupby(['A','C'], group_keys=False).apply(lambda x: x.ix[x.B.idxmax()]).reset_index(drop=True)
Isso redefinirá o índice, pois seu valor padrão seria um índice múltiplo composto por'A'
e'C'
A resposta principal é fazer muito trabalho e parece muito lenta para conjuntos de dados maiores.
apply
é lento e deve ser evitado, se possível.ix
está obsoleto e deve ser evitado também.Ou simplesmente agrupe por todas as outras colunas e obtenha o máximo da coluna necessária.
df.groupby('A', as_index=False).max()
fonte
lamba
função ao soltar. Por exemplo, como posso soltar apenas valores menores que a média desses valores duplicados?Solução mais simples:
Para eliminar duplicatas com base em uma coluna:
Para eliminar duplicatas com base em várias colunas:
fonte
Tente o seguinte:
fonte
Eu classificaria o quadro de dados primeiro com a Coluna B descendente, depois soltaria duplicatas da Coluna A e manteria
sem nenhum groupby
fonte
Você pode tentar isso também
Mencionei isso em https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates.html
fonte
Eu acho que no seu caso você realmente não precisa de um grupo. Gostaria de classificar por ordem decrescente sua coluna B, em seguida, largar duplicatas na coluna A e, se você quiser, também pode ter um novo índice limpo e agradável assim:
fonte
Aqui está uma variação que eu tive que resolver e que vale a pena compartilhar: para cada string exclusiva,
columnA
eu queria encontrar a string associada mais comumcolumnB
.df.groupby('columnA').agg({'columnB': lambda x: x.mode().any()}).reset_index()
O
.any()
escolhe se houver um empate para o modo. (Observe que o uso.any()
de uma série deint
s retorna um booleano em vez de escolher um deles.)Para a pergunta original, a abordagem correspondente simplifica a
df.groupby('columnA').columnB.agg('max').reset_index()
.fonte
Quando as postagens já respondidas respondem à pergunta, fiz uma pequena alteração adicionando o nome da coluna na qual a função max () é aplicada para melhor legibilidade do código.
fonte
A maneira mais fácil de fazer isso:
fonte
isso também funciona:
fonte
Não vou lhe dar a resposta completa (acho que você não está procurando a análise e a gravação da parte do arquivo), mas uma dica essencial deve ser suficiente: use a
set()
função python e, em seguida,sorted()
ou em.sort()
conjunto com.reverse()
:fonte