Đặt thứ tự các cột trong khung dữ liệu gấu trúc


103

Có cách nào để sắp xếp lại các cột trong khung dữ liệu gấu trúc dựa trên sở thích cá nhân của tôi (tức là không sắp xếp theo thứ tự bảng chữ cái hoặc số, mà giống như theo một số quy ước nhất định)?

Ví dụ đơn giản:

frame = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']})

tạo ra cái này:

   one thing other thing  second thing
0          1           a           0.1
1          2           e           0.2
2          3           i           1.0
3          4           o           2.0

Nhưng thay vào đó, tôi muốn điều này:

   one thing second thing  other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

(Vui lòng cung cấp một giải pháp chung chung thay vì cụ thể cho trường hợp này. Rất cảm ơn.)

Câu trả lời:


156

Chỉ cần tự chọn thứ tự bằng cách nhập tên cột. Lưu ý dấu ngoặc kép:

frame = frame[['column I want first', 'column I want second'...etc.]]

25
Điều này chỉ hoạt động với ví dụ khá nhỏ này. Nếu bạn đang đọc dữ liệu từ một nguồn khác, chẳng hạn như tệp csv hoặc bảng cơ sở dữ liệu, bạn không thể sử dụng câu trả lời này. Và những điều đó dường như phổ biến hơn nhiều. OP đã yêu cầu một giải pháp chung.
chrisfs 07/07/18

83

Bạn có thể sử dụng cái này:

columnsTitles = ['onething', 'secondthing', 'otherthing']

frame = frame.reindex(columns=columnsTitles)

5
Mặc dù hầu hết các giải pháp khác ngắn gọn hơn, tôi sẽ coi đây là giải pháp dễ đọc nhất cho bất kỳ ai không quen thuộc 100% pandas.
Dirk

3
Hãy nhớ gán giá trị trả về cho một biến, điều này không sửa đổi thứ tự cột tại chỗ (ít nhất là không phải trong pandasv0.23 ').
Dirk

Cảm ơn bạn đã gợi ý @Dirk
Okroshiashvili

33

Đây là một giải pháp tôi rất thường xuyên sử dụng. Khi bạn có một tập dữ liệu lớn với hàng tấn cột, bạn chắc chắn không muốn sắp xếp lại tất cả các cột theo cách thủ công.

Những gì bạn có thể và rất có thể muốn làm là chỉ cần sắp xếp thứ tự một vài cột đầu tiên mà bạn thường xuyên sử dụng và để tất cả các cột khác chỉ là chính nó. Đây là cách tiếp cận phổ biến trong R.df %>%select(one, two, three, everything())

Vì vậy, trước tiên bạn có thể nhập thủ công các cột bạn muốn sắp xếp và được đặt trước tất cả các cột khác trong danh sách cols_to_order.

Sau đó, bạn tạo danh sách cho các cột mới bằng cách kết hợp các cột còn lại:

new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())

Sau đó, bạn có thể sử dụng new_columnsnhư các giải pháp khác được đề xuất.

import pandas as pd
frame = pd.DataFrame({
    'one thing': [1, 2, 3, 4],
    'other thing': ['a', 'e', 'i', 'o'],
    'more things': ['a', 'e', 'i', 'o'],
    'second thing': [0.1, 0.2, 1, 2],
})

cols_to_order = ['one thing', 'second thing']
new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())
frame = frame[new_columns]

   one thing  second thing other thing more things
0          1           0.1           a           a
1          2           0.2           e           e
2          3           1.0           i           i
3          4           2.0           o           o

1
rực rỡ, hoàn hảo. cảm ơn bạn đã giúp tôi không phải gõ ra mọi tên cột hoặc chỉ mục
stuart

Đây là câu trả lời chung và phải là câu trả lời được chấp nhận
CarlosH

26

Bạn cũng có thể làm điều gì đó như df = df[['x', 'y', 'a', 'b']]

import pandas as pd
frame = pd.DataFrame({'one thing':[1,2,3,4],'second thing':[0.1,0.2,1,2],'other thing':['a','e','i','o']})
frame = frame[['second thing', 'other thing', 'one thing']]
print frame
   second thing other thing  one thing
0           0.1           a          1
1           0.2           e          2
2           1.0           i          3
3           2.0           o          4

Ngoài ra, bạn có thể nhận danh sách các cột với:

cols = list(df.columns.values)

Đầu ra sẽ tạo ra một cái gì đó như thế này:

['x', 'y', 'a', 'b']

Sau đó dễ dàng sắp xếp lại theo cách thủ công.


13

Xây dựng nó bằng một danh sách thay vì một từ điển

frame = pd.DataFrame([
        [1, .1, 'a'],
        [2, .2, 'e'],
        [3,  1, 'i'],
        [4,  4, 'o']
    ], columns=['one thing', 'second thing', 'other thing'])

frame

   one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           4.0           o

Tôi không thể lấy 'tên cột': dữ liệu để hoạt động bên trong danh sách như trong một câu lệnh.
Kim Miller

10

Bạn cũng có thể sử dụng OrderedDict:

In [183]: from collections import OrderedDict

In [184]: data = OrderedDict()

In [185]: data['one thing'] = [1,2,3,4]

In [186]: data['second thing'] = [0.1,0.2,1,2]

In [187]: data['other thing'] = ['a','e','i','o']

In [188]: frame = pd.DataFrame(data)

In [189]: frame
Out[189]:
   one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

6

Thêm thông số 'cột':

frame = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']},
        columns=['one thing', 'second thing', 'other thing']
)

4

Hãy thử lập chỉ mục (vì vậy bạn muốn có một giải pháp chung không chỉ cho việc này, vì vậy thứ tự chỉ mục có thể là những gì bạn muốn):

l=[0,2,1] # index order
frame=frame[[frame.columns[i] for i in l]]

Hiện nay:

print(frame)

Là:

   one thing second thing  other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

-2

Tôi thấy điều này là đơn giản và hiệu quả nhất:

df = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']})

df = df[['one thing','second thing', 'other thing']]
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.