2014-09-12 29 views
7

Tôi cần tìm cách nhanh nhất để sắp xếp từng hàng trong một khung dữ liệu với hàng triệu hàng và khoảng một trăm cột.Cách nhanh nhất để sắp xếp từng hàng trong một khung dữ liệu gấu trúc

Vì vậy, một cái gì đó như thế này:

A B C D 
3 4 8 1 
9 2 7 2 

nhu cầu để trở thành:

A B C D 
8 4 3 1 
9 7 2 2 

Ngay bây giờ tôi đang áp dụng sắp xếp để mỗi hàng và xây dựng một hàng dataframe mới bằng cách liên tiếp. Tôi cũng đang làm một vài thứ phụ, ít quan trọng hơn cho mỗi hàng (do đó tại sao tôi lại sử dụng gấu trúc và không phải là gumpy). Thay vào đó có thể nhanh hơn để tạo danh sách các danh sách và sau đó tạo dataframe mới cùng một lúc không? Hay tôi cần phải đi cython?

+0

Chuyển đổi, sắp xếp, chuyển nó trở lại? –

+0

Làm thế nào để chuyển nó làm cho việc phân loại nhanh hơn? – Luke

+0

Bạn chỉ cần thay đổi "chế độ xem" của ánh xạ ... vì vậy bạn vẫn cần phải thực hiện sắp xếp, nhưng bạn xoay một 1mx100 thành 100x1m trong cùng một không gian, sắp xếp, sau đó đảo ngược, bạn chỉ có chế độ xem khác nhau trên dữ liệu trở lại –

Trả lời

10

Tôi nghĩ rằng tôi sẽ làm điều này trong NumPy:

In [11]: a = df.values 

In [12]: a.sort(axis=1) # no ascending argument 

In [13]: a = a[:, ::-1] # so reverse 

In [14]: a 
Out[14]: 
array([[8, 4, 3, 1], 
     [9, 7, 2, 2]]) 

In [15]: pd.DataFrame(a, df.index, df.columns) 
Out[15]: 
    A B C D 
0 8 4 3 1 
1 9 7 2 2 

Tôi đã nghĩ điều này có thể làm việc, nhưng nó sắp xếp các cột:

In [21]: df.sort(axis=1, ascending=False) 
Out[21]: 
    D C B A 
0 1 8 4 3 
1 2 7 2 9 

Ah, gấu trúc tăng:

In [22]: df.sort(df.columns, axis=1, ascending=False) 
ValueError: When sorting by column, axis must be 0 (rows) 
4

Để thêm vào câu trả lời được đưa ra bởi @A ndy-Hayden, để làm điều này tại chỗ cho toàn bộ khung ... không thực sự chắc chắn tại sao điều này hoạt động, nhưng nó có. Dường như không kiểm soát được thứ tự.

In [97]: A = pd.DataFrame(np.random.randint(0,100,(4,5)), columns=['one','two','three','four','five']) 

    In [98]: A 
    Out[98]: 
    one two three four five 
    0 22 63  72 46 49 
    1 43 30  69 33 25 
    2 93 24  21 56 39 
    3 3 57  52 11 74 

    In [99]: A.values.sort 
    Out[99]: <function ndarray.sort> 

    In [100]: A 
    Out[100]: 
    one two three four five 
    0 22 63  72 46 49 
    1 43 30  69 33 25 
    2 93 24  21 56 39 
    3 3 57  52 11 74 

    In [101]: A.values.sort() 

    In [102]: A 
    Out[102]: 
    one two three four five 
    0 22 46  49 63 72 
    1 25 30  33 43 69 
    2 21 24  39 56 93 
    3 3 11  52 57 74 
    In [103]: A = A.iloc[:,::-1] 

    In [104]: A 
    Out[104]: 
    five four three two one 
    0 72 63  49 46 22 
    1 69 43  33 30 25 
    2 93 56  39 24 21 
    3 74 57  52 11 3 

Tôi hy vọng ai đó có thể giải thích lý do tại sao những điều này, chỉ cần hạnh phúc mà nó hoạt động 8)

+0

'A.values' trả về biểu diễn cục bộ của' A', do đó, 'sắp xếp' này chỉ là một kiểu sắp xếp gọn gàng, được thực hiện tại chỗ. – ptrj

1

Bạn có thể sử dụng pd.apply.

Eg: 

A = pd.DataFrame(np.random.randint(0,100,(4,5)), columns=['one','two','three','four','five']) 
print (A) 

    one two three four five 
0 2 75  44 53 46 
1 18 51  73 80 66 
2 35 91  86 44 25 
3 60 97  57 33 79 

A = A.apply(np.sort, axis = 1) 
print(A) 

    one two three four five 
0 2 44  46 53 75 
1 18 51  66 73 80 
2 25 35  44 86 91 
3 33 57  60 79 97 

Vì bạn muốn theo thứ tự giảm dần, bạn có thể chỉ cần nhân khung dữ liệu với -1 và sắp xếp nó.

A = pd.DataFrame(np.random.randint(0,100,(4,5)), columns=['one','two','three','four','five']) 
A = A * -1 
A = A.apply(np.sort, axis = 1) 
A = A * -1 
Các vấn đề liên quan