Giả sử tôi có một dataframe với các cột a, bvà c, tôi muốn sắp xếp dataframe theo cột btrong thứ tự tăng dần, và theo cột cthứ 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, bvà c, tôi muốn sắp xếp dataframe theo cột btrong thứ tự tăng dần, và theo cột cthứ 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, 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)
sortphương thức cho một biến hoặc thêm inplace=Truevà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 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'.