jak posortować ramkę danych pand z jednej kolumny

237

Mam taką ramkę danych:

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

Jak widać, miesięcy nie ma w porządku kalendarzowym. Utworzyłem więc drugą kolumnę, aby uzyskać numer miesiąca odpowiadający każdemu miesiącowi (1-12). Stamtąd, jak mogę posortować tę ramkę danych według kolejności miesięcy kalendarzowych?

Sachila Ranawaka
źródło

Odpowiedzi:

326

Użyj, sort_valuesaby posortować plik df według wartości określonej kolumny:

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

Jeśli chcesz sortować według dwóch kolumn, przekaż listę etykiet kolumn sort_valuesz etykietami kolumn uporządkowanymi według priorytetu sortowania. Jeśli użyjesz df.sort_values(['2', '0']), wynik zostanie posortowany według kolumny, 2a następnie kolumny 0. To prawda, że ​​tak naprawdę nie ma to sensu w tym przykładzie, ponieważ każda wartość df['2']jest unikalna.

EdChum
źródło
75

Wypróbowałem powyższe rozwiązania i nie osiągam rezultatów, więc znalazłem inne rozwiązanie, które działa dla mnie. Rosnąco = False jest nakazanie dataframe w malejącym porządku, domyślnie jest to prawda . Używam wersji Python 3.6.6 i pandy 0.23.4.

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

Możesz zobaczyć więcej szczegółów w dokumentacji pand tutaj .

Joel Carneiro
źródło
9

Wystarczy dodać więcej operacji na danych. Załóżmy, że mamy ramkę danych df, możemy wykonać kilka operacji, aby uzyskać pożądane wyniki

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)

poda sortedwyjście etykiet jakodataframe

    index   label
0   test        2
1   experiment  1
Harry_pb
źródło
7

Podobnie jak inne rozwiązanie:

możesz kategoryzować dane ciągów (nazwa miesiąca) i sortować według tego w następujący sposób:

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)

Otrzymasz uporządkowane dane według danych month namepodanych podczas tworzenia Categoricalobiektu.

alireza yazdandoost
źródło