2014-09-03 18 views
7

Trong MATLAB, để trao đổi các cột đầu tiên và thứ hai của một bảng A, người ta sẽ làm điều nàyLàm cách nào để trao đổi hai cột DataFrame?

A = A(:, [2 1 3:end]); 

Có một cách thuận tiện tương tự để làm điều này nếu A là một gấu trúc DataFrame để thay thế?

MATLAB sử dụng 1 dựa trên lập chỉ mục.

Trả lời

0
c = A.columns 
A = A[c[np.r_[1, 0, 2:len(c)]]] 

hoặc, thậm chí dễ dàng hơn:

A[[c[0], c[1]]] = A[[c[1], c[0]]] 

* chỉnh sửa: cố định cho mỗi lời đề nghị của Ivan.

+2

thứ hai sẽ không hoạt động, nó sẽ kết thúc với với hai cột 1 – Ivan

+1

thứ hai vẫn không làm việc – RNA

8

Một biến thể nhẹ về câu trả lời acushner của:

# get a list of the columns 
col_list = list(df) 
# use this handy way to swap the elements 
col_list[0], col_list[1] = col_list[1], col_list[0] 
# assign back, the order will now be swapped 
df.columns = col_list 

dụ:

In [39]: 

df = pd.DataFrame({'a':randn(3), 'b':randn(3), 'c':randn(3)}) 
df 
Out[39]: 
      a   b   c 
0 -0.682446 -0.200654 -1.609470 
1 -1.998113 0.806378 1.252384 
2 -0.250359 3.774708 1.100771 
In [40]: 

col_list = list(df) 
col_list[0], col_list[1] = col_list[1], col_list[0] 
df.columns = col_list 
df 
Out[40]: 
      b   a   c 
0 -0.682446 -0.200654 -1.609470 
1 -1.998113 0.806378 1.252384 
2 -0.250359 3.774708 1.100771 

CẬP NHẬT

Nếu bạn chỉ muốn thay đổi thứ tự cột mà không thay đổi nội dung cột sau đó bạn có thể reindex sử dụng lập chỉ mục ưa thích:

In [34]: 
cols = list(df) 
cols[1], cols[0] = cols[0], cols[1] 
cols 

Out[34]: 
['b', 'a', 'c'] 

In [35]: 
df.ix[:,cols] 

Out[35]: 
      b   a   c 
0 -0.200654 -0.682446 -1.609470 
1 0.806378 -1.998113 1.252384 
2 3.774708 -0.250359 1.100771 
+0

Điều này sẽ hoán đổi tên cột, chứ không phải các giá trị. Đó không phải là những gì kjo hỏi. – JaviMerino

+0

@JaviMerino OP không chỉ định nếu họ muốn hoán đổi thứ tự hoặc nội dung cột – EdChum

+0

@JaviMerino Trên thực tế bạn có đọc nội dung câu trả lời của tôi đúng không? Bạn có thể thấy rõ ràng rằng vị trí và giá trị cột a và b đã hoán đổi – EdChum

1

cuối cùng tôi giải quyết cho việc này:

A = A.iloc[:, [1, 0] + range(2, A.shape[1])] 

Đó là ít thuận tiện hơn so với phiên bản MATLAB, nhưng tôi thích thực tế là nó không yêu cầu tạo ra các biến tạm thời.

+0

Bạn có muốn sắp xếp lại thứ tự colunn (không thay đổi nội dung cột liên quan) không? ví dụ. 'df.ix [:, ['b', 'a', 'c']]' là cái bạn muốn? – EdChum

11

gấu trúc có phương thức reindex. Bạn chỉ cần đưa ra một danh sách với các tên cột theo thứ tự bạn muốn:

columnsTitles=["B","A"] 
df=df.reindex(columns=columnsTitles) 

Cheers

+0

Đây phải là câu trả lời được chấp nhận. – RobertJoseph

Các vấn đề liên quan