Załóżmy, że mam dataframe z kolumnami a
, b
a c
chcę, aby posortować dataframe przez kolumny b
w kolejności rosnącej, a przez kolumny c
w kolejności malejącej, w jaki sposób mogę to zrobić?
Załóżmy, że mam dataframe z kolumnami a
, b
a c
chcę, aby posortować dataframe przez kolumny b
w kolejności rosnącej, a przez kolumny c
w kolejności malejącej, w jaki sposób mogę to zrobić?
Odpowiedzi:
W wersji 0.17.0 sort
metoda była przestarzała na korzyść sort_values
. sort
został całkowicie usunięty w wersji 0.20.0. Argumenty (i wyniki) pozostają takie same:
df.sort_values(['a', 'b'], ascending=[True, False])
Możesz użyć argumentu rosnącego sort
:
df.sort(['a', 'b'], ascending=[True, False])
Na przykład:
In [11]: df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])
In [12]: df1.sort(['a', 'b'], ascending=[True, False])
Out[12]:
a b
2 1 4
7 1 3
1 1 2
3 1 2
4 3 2
6 4 4
0 4 3
9 4 3
5 4 1
8 4 1
Skomentowane przez @renadeen
Sortowanie domyślnie nie jest dostępne! Powinieneś więc przypisać wynik metody sortowania do zmiennej lub dodać inplace = True do wywołania metody.
to znaczy, jeśli chcesz ponownie użyć df1 jako posortowanej DataFrame:
df1 = df1.sort(['a', 'b'], ascending=[True, False])
lub
df1.sort(['a', 'b'], ascending=[True, False], inplace=True)
sort
metody do zmiennej lub dodać inplace=True
do wywołania metody.
Począwszy od pand 0.17.0, DataFrame.sort()
jest przestarzały i ustawiony do usunięcia w przyszłej wersji pand. Sposób sortowania ramki danych według jej wartości jest terazDataFrame.sort_values
Jako taka, odpowiedź na twoje pytanie byłaby teraz
df.sort_values(['b', 'c'], ascending=[True, False], inplace=True)
W przypadku dużych ramek danych danych liczbowych można zauważyć znaczną poprawę wydajności numpy.lexsort
, która wykonuje sortowanie pośrednie przy użyciu sekwencji kluczy:
import pandas as pd
import numpy as np
np.random.seed(0)
df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])
df1 = pd.concat([df1]*100000)
def pdsort(df1):
return df1.sort_values(['a', 'b'], ascending=[True, False])
def lex(df1):
arr = df1.values
return pd.DataFrame(arr[np.lexsort((-arr[:, 1], arr[:, 0]))])
assert (pdsort(df1).values == lex(df1).values).all()
%timeit pdsort(df1) # 193 ms per loop
%timeit lex(df1) # 143 ms per loop
Jedną ze szczególnych cech jest numpy.lexsort
odwrócenie zdefiniowanej kolejności sortowania : najpierw (-'b', 'a')
sortuje według serii a
. Negujemy serię, b
aby odzwierciedlić chcemy, aby ta seria była w kolejności malejącej.
Pamiętaj, że np.lexsort
sortuje tylko wartości liczbowe, podczas gdy pd.DataFrame.sort_values
działa z wartościami ciągowymi lub numerycznymi. Korzystanie np.lexsort
z ciągów da: TypeError: bad operand type for unary -: 'str'
.