cột python dataframe thả cột bằng cách sử dụng int


Câu trả lời:


167

Bạn có thể xóa cột trên ichỉ mục như thế này:

df.drop(df.columns[i], axis=1)

Nó có thể hoạt động lạ, nếu bạn có các tên trùng lặp trong các cột, vì vậy để làm điều này, bạn có thể đổi tên cột bạn muốn xóa cột theo tên mới. Hoặc bạn có thể gán lại DataFrame như thế này:

df = df.iloc[:, [j for j, c in enumerate(df.columns) if j != i]]

4
Tôi nghĩ rằng bạn đã bỏ lỡ điểm - họ muốn giảm theo chỉ số, không phải theo nhãn. Chuyển đổi chỉ mục thành nhãn chỉ giảm theo nhãn :(
Darren

Cách lập chỉ mục cols, nếu tôi phải thả 100 cột liên tục ở giữa khung dữ liệu
Sai Kiran

110

Thả nhiều cột như thế này:

cols = [1,2,4,5,12]
df.drop(df.columns[cols],axis=1,inplace=True)

inplace=Trueđược sử dụng để thực hiện các thay đổi trong chính khung dữ liệu mà không thực hiện việc thả cột trên bản sao của khung dữ liệu. Nếu bạn cần giữ nguyên bản gốc của mình, hãy sử dụng:

df_after_dropping = df.drop(df.columns[cols],axis=1)

3
Đối số tại chỗ là gì?
sidpat 8/2/2016

12
nếu bạn không sử dụng inplace=Truethì bạn sẽ phải làm df = df.drop()nếu bạn muốn thấy sự thay đổi của dfchính nó.
muon

Làm thế nào để lập chỉ mục cols, nếu tôi phải thả 100 cột liên tục ở giữa khung dữ liệu.
Sai Kiran

36

Nếu có nhiều cột có tên giống nhau, các giải pháp được đưa ra ở đây cho đến nay sẽ loại bỏ tất cả các cột, có thể không phải là thứ mà người ta đang tìm kiếm. Đây có thể là trường hợp nếu một người đang cố gắng loại bỏ các cột trùng lặp ngoại trừ một trường hợp. Ví dụ dưới đây làm rõ tình huống này:

# make a df with duplicate columns 'x'
df = pd.DataFrame({'x': range(5) , 'x':range(5), 'y':range(6, 11)}, columns = ['x', 'x', 'y']) 


df
Out[495]: 
   x  x   y
0  0  0   6
1  1  1   7
2  2  2   8
3  3  3   9
4  4  4  10

# attempting to drop the first column according to the solution offered so far     
df.drop(df.columns[0], axis = 1) 
   y
0  6
1  7
2  8
3  9
4  10

Như bạn có thể thấy, cả hai cột X đều bị loại bỏ. Giải pháp thay thế:

column_numbers = [x for x in range(df.shape[1])]  # list of columns' integer indices

column_numbers .remove(0) #removing column integer index 0
df.iloc[:, column_numbers] #return all columns except the 0th column

   x  y
0  0  6
1  1  7
2  2  8
3  3  9
4  4  10

Như bạn có thể thấy, điều này thực sự chỉ xóa cột thứ 0 (đầu tiên 'x').


1
Bạn là anh hùng của tôi. Đã cố gắng nghĩ ra một cách thông minh để làm điều này quá lâu.
ATK7474

5

Bạn cần xác định các cột dựa trên vị trí của chúng trong khung dữ liệu. Ví dụ: nếu bạn muốn thả (del) cột số 2,3 và 5, nó sẽ là,

df.drop(df.columns[[2,3,5]], axis = 1)

4

Nếu bạn có hai cột có cùng tên. Một cách đơn giản là tự đổi tên các cột như thế này: -

df.columns = ['column1', 'column2', 'column3']

Sau đó, bạn có thể thả qua chỉ mục cột như bạn yêu cầu, như thế này: -

df.drop(df.columns[1], axis=1, inplace=True)

df.column[1] sẽ giảm chỉ số 1.

Nhớ trục 1 = cột và trục 0 = hàng.


3

nếu bạn thực sự muốn làm điều đó với số nguyên (nhưng tại sao?), thì bạn có thể xây dựng một từ điển.

col_dict = {x: col for x, col in enumerate(df.columns)}

sau đó df = df.drop(col_dict[0], 1)sẽ làm việc như mong muốn

chỉnh sửa: bạn có thể đặt nó trong một chức năng làm điều đó cho bạn, mặc dù cách này nó tạo ra từ điển mỗi khi bạn gọi nó

def drop_col_n(df, col_n_to_drop):
    col_dict = {x: col for x, col in enumerate(df.columns)}
    return df.drop(col_dict[col_n_to_drop], 1)

df = drop_col_n(df, 2)


-1

Vì có thể có nhiều cột có cùng tên, trước tiên chúng ta nên đổi tên các cột. Đây là mã cho giải pháp.

df.columns=list(range(0,len(df.columns)))
df.drop(columns=[1,2])#drop second and third columns
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.