Làm thế nào để chọn tất cả các cột, ngoại trừ một cột trong gấu trúc?


277

Tôi có một khung dữ liệu trông như thế này:

import pandas
import numpy as np
df = DataFrame(np.random.rand(4,4), columns = list('abcd'))
df
      a         b         c         d
0  0.418762  0.042369  0.869203  0.972314
1  0.991058  0.510228  0.594784  0.534366
2  0.407472  0.259811  0.396664  0.894202
3  0.726168  0.139531  0.324932  0.906575

Làm thế nào tôi có thể nhận được tất cả các cột ngoại trừ column b?


@ cs95 - Mục tiêu trùng lặp hiện được liệt kê không phải là trùng lặp. Mặc dù tiêu đề ban đầu, câu hỏi được liên kết là "Tại sao cú pháp cụ thể này không hoạt động", trong khi câu hỏi này là một câu tổng quát hơn "Cách tốt nhất để làm điều này" là gì. - Thêm vào đó là sự khác biệt giữa việc xóa một cột khỏi DataFrame hiện tại so với việc tạo một DataFrame mới với tất cả các nhưng một trong các cột của cột khác.
RM

@RM Tôi xin lỗi nhưng tôi không đồng ý với chỉnh sửa bạn đã thực hiện cho tiêu đề trên bài đăng đó, vì vậy tôi đã khôi phục nó. Đúng là ý định của OP là đặt câu hỏi về cú pháp, nhưng bài đăng đã phát triển để giải quyết câu hỏi rộng hơn về cách xóa một cột. Các câu trả lời trong bài này là các bản sao của bài viết được đánh giá cao nhất ở đó. Các dupe ở lại.
cs95

Lưu ý câu hỏi này đang được thảo luận trên Meta .
Khỉ Heretic

Câu trả lời:


420

Khi các cột không phải là Multi Index, df.columnschỉ là một mảng các tên cột để bạn có thể thực hiện:

df.loc[:, df.columns != 'b']

          a         c         d
0  0.561196  0.013768  0.772827
1  0.882641  0.615396  0.075381
2  0.368824  0.651378  0.397203
3  0.788730  0.568099  0.869127

13
Không tệ, nhưng giải pháp của @ mike sử dụng droplà IMO tốt hơn. Dễ đọc hơn một chút và xử lý đa luồng
travc

5
Tôi thực sự đồng ý rằng giải pháp của @ mike sử dụng droplà tốt hơn - Tôi nghĩ thật hữu ích khi phát hiện ra rằng các cột (một cấp) là các mảng bạn có thể làm việc với, nhưng cụ thể là để thả một cột, droprất dễ đọc và hoạt động tốt với các chỉ mục phức tạp.
Marius

1
Cảm ơn bạn cho câu trả lời tuyệt vời này. Nếu tôi không có tiêu đề thì sao? Làm thế nào để tôi nhập học?
FabioSpaghetti

1
Còn khi bạn có nhiều hơn 1 cột bị bỏ qua thì sao?
Bruno Ambrozio

227

Đừng sử dụng ix. Nó không được dùng nữa . Cách dễ đọc và thành ngữ nhất để làm điều này là df.drop():

>>> df

          a         b         c         d
0  0.175127  0.191051  0.382122  0.869242
1  0.414376  0.300502  0.554819  0.497524
2  0.142878  0.406830  0.314240  0.093132
3  0.337368  0.851783  0.933441  0.949598

>>> df.drop('b', axis=1)

          a         c         d
0  0.175127  0.382122  0.869242
1  0.414376  0.554819  0.497524
2  0.142878  0.314240  0.093132
3  0.337368  0.933441  0.949598

Lưu ý rằng theo mặc định, .drop()không hoạt động tại chỗ; mặc dù tên đáng ngại, dfkhông bị tổn hại bởi quá trình này. Nếu bạn muốn xóa vĩnh viễn bkhỏi df, làm df.drop('b', inplace=True).

df.drop()cũng chấp nhận một danh sách các nhãn, ví dụ như df.drop(['a', 'b'], axis=1)sẽ thả cột ab.


1
Cũng hoạt động trên multiindex giống như bạn mong đợi. df.drop([('l1name', 'l2name'), 'anotherl1name'], axis=1). Có vẻ sử dụng danh sách so với tuple để xác định xem bạn muốn nhiều cột (danh sách) hoặc tham chiếu đến một đa điểm (tuple).
chuyến đi

16
Dễ đọc hơn: df.drop(columns='a')hoặc df.drop(columns=['a', 'b']). Cũng có thể thay thế columns=bằng index=.
BallpointBen

Tuy nhiên, điều này không hữu ích nếu bạn không biết tên của tất cả các cột bạn muốn thả.
yeliabsalohcin

Vì điều này tạo ra một bản sao và không phải là một khung nhìn / tham chiếu, bạn không thể sửa đổi khung dữ liệu gốc bằng cách sử dụng cái này trên LHS của một bài tập.
Jan Christoph Terasa

132
df[df.columns.difference(['b'])]

Out: 
          a         c         d
0  0.427809  0.459807  0.333869
1  0.678031  0.668346  0.645951
2  0.996573  0.673730  0.314911
3  0.786942  0.719665  0.330833

9
Tôi thích cách tiếp cận này vì nó có thể được sử dụng để bỏ qua nhiều hơn một cột.
Nischal Hp

3
@NischalHp df.drop cũng có thể bỏ qua nhiều hơn một cột df.drop (['a', 'b'], trục = 1)
Patrick Li

2
Tôi nghĩ rằng đáng chú ý là điều này có thể sắp xếp lại các cột của bạn
Ocean800 18/11/19

1
@ Ocean800 Đúng vậy. Bạn có thể vượt qua sort=Falsenếu bạn muốn tránh hành vi đó ( df.columns.difference(['b'], sort=False))
ayhan

64

Bạn có thể dùng df.columns.isin()

df.loc[:, ~df.columns.isin(['b'])]

Khi bạn muốn thả nhiều cột, đơn giản như:

df.loc[:, ~df.columns.isin(['col1', 'col2'])]

12

Đây là một cách khác:

df[[i for i in list(df.columns) if i != '<your column>']]

Bạn chỉ cần vượt qua tất cả các cột sẽ được hiển thị ngoại trừ cột bạn không muốn.


5

Một sửa đổi nhỏ khác cho @Salvador Dali cho phép loại bỏ danh sách các cột:

df[[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]

hoặc là

df.loc[:,[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]

4

Tôi nghĩ cách tốt nhất để làm là cách được đề cập bởi @Salvador Dali. Không phải những người khác là sai.

Bởi vì khi bạn có một tập dữ liệu mà bạn chỉ muốn chọn một cột và đặt nó vào một biến và các cột còn lại thành một cột khác để so sánh hoặc tính toán. Sau đó thả cột của tập dữ liệu có thể không giúp đỡ. Tất nhiên có những trường hợp sử dụng cho điều đó là tốt.

x_cols = [x for x in data.columns if x != 'name of column to be excluded']

Sau đó, bạn có thể đặt tập hợp các cột đó trong biến x_colsthành một biến khác như x_cols1đối với tính toán khác.

ex: x_cols1 = data[x_cols]

Bạn có thể giải thích tại sao đây là một câu trả lời riêng thay vì nhận xét / mở rộng cho câu trả lời của Salvador không?

3

Đây là một dòng lambda:

df[map(lambda x :x not in ['b'], list(df.columns))]

trước :

import pandas
import numpy as np
df = pd.DataFrame(np.random.rand(4,4), columns = list('abcd'))
df

       a           b           c           d
0   0.774951    0.079351    0.118437    0.735799
1   0.615547    0.203062    0.437672    0.912781
2   0.804140    0.708514    0.156943    0.104416
3   0.226051    0.641862    0.739839    0.434230

sau :

df[map(lambda x :x not in ['b'], list(df.columns))]

        a          c          d
0   0.774951    0.118437    0.735799
1   0.615547    0.437672    0.912781
2   0.804140    0.156943    0.104416
3   0.226051    0.739839    0.434230
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.