Phân loại gấu trúc 101
sort
đã được thay thế trong v0.20 bởi DataFrame.sort_values
và DataFrame.sort_index
. Bên cạnh điều này, chúng tôi cũng có argsort
.
Dưới đây là một số trường hợp sử dụng phổ biến trong sắp xếp và cách giải quyết chúng bằng cách sử dụng các hàm sắp xếp trong API hiện tại. Đầu tiên, thiết lập.
# Setup
np.random.seed(0)
df = pd.DataFrame({'A': list('accab'), 'B': np.random.choice(10, 5)})
df
A B
0 a 7
1 c 9
2 c 3
3 a 5
4 b 2
Sắp xếp theo một cột
Ví dụ: để sắp xếp df
theo cột "A", hãy sử dụng sort_values
với một tên cột duy nhất:
df.sort_values(by='A')
A B
0 a 7
3 a 5
4 b 2
1 c 9
2 c 3
Nếu bạn cần một RangeIndex mới, hãy sử dụng DataFrame.reset_index
.
Sắp xếp theo nhiều cột
Ví dụ: để sắp xếp theo cả cột "A" và "B" df
, bạn có thể chuyển một danh sách vào sort_values
:
df.sort_values(by=['A', 'B'])
A B
3 a 5
0 a 7
4 b 2
2 c 3
1 c 9
Sắp xếp theo Chỉ mục DataFrame
df2 = df.sample(frac=1)
df2
A B
1 c 9
0 a 7
2 c 3
3 a 5
4 b 2
Bạn có thể làm điều này bằng cách sử dụng sort_index
:
df2.sort_index()
A B
0 a 7
1 c 9
2 c 3
3 a 5
4 b 2
df.equals(df2)
# False
df.equals(df2.sort_index())
# True
Dưới đây là một số phương pháp có thể so sánh với hiệu suất của chúng:
%timeit df2.sort_index()
%timeit df2.iloc[df2.index.argsort()]
%timeit df2.reindex(np.sort(df2.index))
605 µs ± 13.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
610 µs ± 24.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
581 µs ± 7.63 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Sắp xếp theo danh sách chỉ số
Ví dụ,
idx = df2.index.argsort()
idx
# array([0, 7, 2, 3, 9, 4, 5, 6, 8, 1])
Vấn đề "sắp xếp" này thực sự là một vấn đề lập chỉ mục đơn giản. Chỉ cần chuyển nhãn số nguyên đến iloc
sẽ làm được.
df.iloc[idx]
A B
1 c 9
0 a 7
2 c 3
3 a 5
4 b 2