Como localizo todas as linhas em um dataframe do pandas que tenham o valor máximo para a count
coluna após o agrupamento por ['Sp','Mt']
colunas?
Exemplo 1: o seguinte dataFrame, que eu agrupo por ['Sp','Mt']
:
Sp Mt Value count
0 MM1 S1 a **3**
1 MM1 S1 n 2
2 MM1 S3 cb 5
3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 2
8 MM4 S2 uyi **7**
Saída esperada: obtenha as linhas de resultado cuja contagem é máxima entre os grupos, como:
0 MM1 S1 a **3**
1 3 MM2 S3 mk **8**
4 MM2 S4 bg **10**
8 MM4 S2 uyi **7**
Exemplo 2: esse quadro de dados, que eu agrupo por ['Sp','Mt']
:
Sp Mt Value count
4 MM2 S4 bg 10
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 8
8 MM4 S2 uyi 8
Para o exemplo acima, quero obter todas as linhas onde count
é igual a max, em cada grupo, por exemplo:
MM2 S4 bg 10
MM4 S2 cb 8
MM4 S2 uyi 8
python
pandas
max
pandas-groupby
jojo12
fonte
fonte
1 3
?Respostas:
Para obter os índices do DF original, você pode:
Observe que, se você tiver vários valores máximos por grupo, todos serão retornados.
Atualizar
Se houver uma chance, é isso que o OP está solicitando:
fonte
idx
abordagem. Porém, só posso pagar um único máximo para cada grupo (e meus dados têm alguns duplicados-máximos). existe uma maneira de contornar isso com sua solução?transform
O método pode ter desempenho de pool quando o conjunto de dados for grande o suficiente, obtenha o valor máximo primeiro e depois mesclar os quadros de dados.Você pode classificar o dataFrame por contagem e remover duplicatas. Eu acho que é mais fácil:
fonte
inplace = True
como um argumento paradrop_duplicates
A solução fácil seria aplicar a função: idxmax () para obter índices de linhas com valores máximos. Isso filtraria todas as linhas com valor máximo no grupo.
fonte
"I want to get ALL the rows where count equals max in each group"
, deidxmax
Return[s] index of first occurrence of maximum over requested axis"
acordo com os documentos (0,21).Tendo tentado a solução sugerida por Zelazny em um DataFrame relativamente grande (~ 400k linhas), achei muito lento. Aqui está uma alternativa que eu encontrei para executar ordens de magnitude mais rapidamente no meu conjunto de dados.
fonte
df[df['count'] == df['count_max']]
perderá linhas de NaN, bem como as respostas acima.Você pode não precisar se relacionar com o grupo usando
sort_values
+drop_duplicates
Também quase a mesma lógica usando
tail
fonte
Para mim, a solução mais fácil seria manter o valor quando a contagem for igual ao máximo. Portanto, o seguinte comando de uma linha é suficiente:
fonte
Uso
groupby
eidxmax
métodos:transferir col
date
paradatetime
:obtenha o índice
max
da colunadate
, depoisgroupyby ad_id
:obtenha os dados desejados:
Fora [54]:
fonte
fonte
Percebendo que "aplicar" "o maior" ao objeto agrupado funciona da mesma maneira:
Vantagem adicional - também pode buscar os n valores superiores, se necessário:
fonte
Tente usar "nlargest" no objeto groupby. A vantagem de usar nlargest é que ele retorna o índice das linhas de onde "os maiores itens" foram buscados. Nota: dividimos o segundo (1) elemento do nosso índice, pois nosso índice, nesse caso, consiste em tuplas (por exemplo, (s1, 0)).
insira a descrição da imagem aqui
fonte
Eu tenho usado esse estilo funcional para muitas operações de grupo:
.reset_index(drop=True)
retorna ao índice original ao largar o índice de grupo.fonte