Giả sử tôi có một dataframe với các cột a
, b
và c
, tôi muốn sắp xếp dataframe theo cột b
trong thứ tự tăng dần, và theo cột c
thứ tự giảm dần, làm thế nào để làm điều này?
Giả sử tôi có một dataframe với các cột a
, b
và c
, tôi muốn sắp xếp dataframe theo cột b
trong thứ tự tăng dần, và theo cột c
thứ tự giảm dần, làm thế nào để làm điều này?
Câu trả lời:
Kể từ phiên bản 0.17.0, sort
phươ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)
sort
phương thức cho một biến hoặc thêm inplace=True
vào lệnh gọi phương thức.
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)
Đố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 a
trướ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.lexsort
chỉ sắp xếp với các giá trị số, trong khi pd.DataFrame.sort_values
hoạt động với các giá trị chuỗi hoặc số. Sử dụng np.lexsort
với chuỗi sẽ cho : TypeError: bad operand type for unary -: 'str'
.