Tôi hiểu rằng để thả một cột bạn sử dụng df.drop ('tên cột', trục = 1). Có cách nào để thả một cột bằng chỉ số bằng số thay vì tên cột không?
Tôi hiểu rằng để thả một cột bạn sử dụng df.drop ('tên cột', trục = 1). Có cách nào để thả một cột bằng chỉ số bằng số thay vì tên cột không?
Câu trả lời:
Bạn có thể xóa cột trên i
chỉ 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]]
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)
inplace=True
thì bạn sẽ phải làm df = df.drop()
nếu bạn muốn thấy sự thay đổi của df
chính nó.
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').
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)
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.
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)
Bạn có thể sử dụng dòng sau để thả hai cột đầu tiên (hoặc bất kỳ cột nào bạn không cần):
df.drop([df.columns[0], df.columns[1]], axis=1)