como classificar o dataframe de pandas de uma coluna

237

Eu tenho um quadro de dados como este:

print(df)

        0          1     2
0   354.7      April   4.0
1    55.4     August   8.0
2   176.5   December  12.0
3    95.5   February   2.0
4    85.6    January   1.0
5     152       July   7.0
6   238.7       June   6.0
7   104.8      March   3.0
8   283.5        May   5.0
9   278.8   November  11.0
10  249.6    October  10.0
11  212.7  September   9.0

Como você pode ver, os meses não estão em ordem do calendário. Então, criei uma segunda coluna para obter o número do mês correspondente a cada mês (1-12). A partir daí, como posso classificar esse quadro de dados de acordo com o pedido dos meses do calendário?

Sachila Ranawaka
fonte

Respostas:

326

Use sort_valuespara classificar o df pelos valores de uma coluna específica:

In [18]:
df.sort_values('2')

Out[18]:
        0          1     2
4    85.6    January   1.0
3    95.5   February   2.0
7   104.8      March   3.0
0   354.7      April   4.0
8   283.5        May   5.0
6   238.7       June   6.0
5   152.0       July   7.0
1    55.4     August   8.0
11  212.7  September   9.0
10  249.6    October  10.0
9   278.8   November  11.0
2   176.5   December  12.0

Se você deseja classificar por duas colunas, passe uma lista de rótulos de coluna para sort_valuesos rótulos de coluna ordenados de acordo com a prioridade de classificação. Se você usar df.sort_values(['2', '0']), o resultado será classificado por coluna 2e coluna 0. Concedido, isso realmente não faz sentido para este exemplo, porque cada valor df['2']é único.

EdChum
fonte
75

Tentei as soluções acima e não alcanço resultados, por isso encontrei uma solução diferente que funciona para mim. O ascendente = False é ordenar a trama de dados na descendente ordem, por padrão, é verdade . Estou usando as versões python 3.6.6 e pandas 0.23.4.

final_df = df.sort_values(by=['2'], ascending=False)

Você pode ver mais detalhes na documentação dos pandas aqui .

Joel Carneiro
fonte
9

Apenas adicionando mais algumas operações nos dados. Suponha que tenhamos um quadro de dados df, podemos realizar várias operações para obter os resultados desejados

ID         cost      tax    label
1       216590      1600    test      
2       523213      1800    test 
3          250      1500    experiment

(df['label'].value_counts().to_frame().reset_index()).sort_values('label', ascending=False)

dará sortedsaída de etiquetas comodataframe

    index   label
0   test        2
1   experiment  1
Harry_pb
fonte
7

Assim como outra solução:

você pode categorizar seus dados de sequência (nome do mês) e classificar da seguinte maneira:

df.rename(columns={1:'month'},inplace=True)
df['month'] = pd.Categorical(df['month'],categories=['December','November','October','September','August','July','June','May','April','March','February','January'],ordered=True)
df = df.sort_values('month',ascending=False)

Ele fornecerá os dados ordenados month nameconforme você especificou ao criar o Categoricalobjeto.

alireza yazdandoost
fonte