Làm cách nào để sắp xếp một DataFrame trong gấu trúc python theo hai hoặc nhiều cột?


Câu trả lời:


454

Kể từ phiên bản 0.17.0, sortphương pháp này không được ủng hộ sort_values. sortđã bị xóa hoàn toàn trong bản phát hành 0.20.0. Các đối số (và kết quả) vẫn giữ nguyên:

df.sort_values(['a', 'b'], ascending=[True, False])

Bạn có thể sử dụng đối số tăng dần của sort:

df.sort(['a', 'b'], ascending=[True, False])

Ví dụ:

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

Theo nhận xét của @renadeen

Sắp xếp không đúng chỗ theo mặc định! Vì vậy, bạn nên gán kết quả của phương thức sắp xếp cho một biến hoặc thêm inplace = True vào phương thức gọi.

nghĩa là, nếu bạn muốn sử dụng lại df1 như một DataFrame được sắp xếp:

df1 = df1.sort(['a', 'b'], ascending=[True, False])

hoặc là

df1.sort(['a', 'b'], ascending=[True, False], inplace=True)

6
Sắp xếp không đúng chỗ theo mặc định! Vì vậy, bạn nên gán kết quả của sortphương thức cho một biến hoặc thêm inplace=Truevào lệnh gọi phương thức.
đổi mới

2
@renadeen điểm rất tốt, tôi đã cập nhật bằng cách trả lời với nhận xét đó.
Andy Hayden

1
Tôi đã ngạc nhiên khi biết rằng ngày nay loại đó đã bị phản đối! Dựa trên một số ý kiến ​​trong bài đăng meta này: meta.stackoverflow.com/questions/297404/NH Tôi đã quyết định thêm một câu trả lời mới thay vì cố gắng chỉnh sửa cho bạn
Kyle Heuton

2
@Snoozer Vâng, tôi không nghĩ sắp xếp sẽ biến mất (chủ yếu là nó được sử dụng rộng rãi trong cuốn sách của Wes), nhưng đã có một số thay đổi lớn trong cách gọi sắp xếp . Cảm ơn! .. Tôi thực sự cần phải tự động hóa để trải qua tất cả 1000 câu trả lời của gấu trúc cho sự phản đối!
Andy Hayden

40

Kể từ gấu trúc 0.17.0, DataFrame.sort()không được dùng nữa và sẽ bị xóa trong phiên bản tương lai của gấu trúc. Cách sắp xếp một khung dữ liệu theo các giá trị của nó bây giờ làDataFrame.sort_values

Như vậy, câu trả lời cho câu hỏi của bạn bây giờ sẽ là

df.sort_values(['b', 'c'], ascending=[True, False], inplace=True)

4

Đối với các tệp dữ liệu lớn của dữ liệu số, bạn có thể thấy một sự cải thiện hiệu suất đáng kể thông qua numpy.lexsort, thực hiện một loại gián tiếp bằng cách sử dụng một chuỗi các phím:

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

Một điều đặc biệt là thứ tự sắp xếp được xác định với numpy.lexsortđảo ngược: (-'b', 'a')sắp xếp theo chuỗi atrước. Chúng tôi phủ nhận loạt bđể phản ánh chúng tôi muốn loạt này theo thứ tự giảm dần.

Xin lưu ý rằng np.lexsortchỉ sắp xếp với các giá trị số, trong khi pd.DataFrame.sort_valueshoạt động với các giá trị chuỗi hoặc số. Sử dụng np.lexsortvới chuỗi sẽ cho : TypeError: bad operand type for unary -: 'str'.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.