python dataframe panda drop kolom menggunakan int

154

Saya mengerti bahwa untuk menjatuhkan kolom Anda menggunakan df.drop ('nama kolom', sumbu = 1). Apakah ada cara untuk menjatuhkan kolom menggunakan indeks numerik alih-alih nama kolom?

pengguna1802143
sumber
Saya pikir ini tidak akan berhasil karena alasan yang ditunjukkan di sini: stackoverflow.com/questions/13411544/…
John

Jawaban:

167

Anda dapat menghapus kolom pada iindeks seperti ini:

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

Ini bisa jadi aneh, jika Anda memiliki nama duplikat di kolom, jadi untuk melakukan ini Anda bisa mengganti nama kolom yang ingin Anda hapus kolom dengan nama baru. Atau Anda dapat menetapkan kembali DataFrame seperti ini:

df = df.iloc[:, [j for j, c in enumerate(df.columns) if j != i]]
Roman Pekar
sumber
4
Saya pikir Anda melewatkan intinya - mereka ingin turun demi indeks, bukan dengan label. Mengubah indeks menjadi label hanya dengan menjatuhkan label :(
Darren
Bagaimana cara mengindeks cols, jika saya harus menjatuhkan 100 kolom yang kontinu di tengah bingkai data
Sai Kiran
111

Jatuhkan beberapa kolom seperti ini:

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

inplace=Truedigunakan untuk membuat perubahan dalam kerangka data itu sendiri tanpa melakukan kolom menjatuhkan salinan bingkai data. Jika Anda perlu mempertahankan yang asli, gunakan:

df_after_dropping = df.drop(df.columns[cols],axis=1)
muon
sumber
3
Untuk apa argumen inplace?
sidpat
12
jika Anda tidak menggunakan inplace=Truemaka Anda harus melakukan df = df.drop()jika Anda ingin melihat perubahan dfitu sendiri.
muon
Bagaimana cara mengindeks cols, jika saya harus menjatuhkan 100 kolom yang kontinu di tengah bingkai data.
Sai Kiran
36

Jika ada beberapa kolom dengan nama yang identik, solusi yang diberikan di sini sejauh ini akan menghapus semua kolom, yang mungkin bukan yang dicari orang. Ini mungkin terjadi jika seseorang mencoba untuk menghapus kolom duplikat kecuali satu contoh. Contoh di bawah ini menjelaskan situasi ini:

# 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

Seperti yang Anda lihat, kedua kolom X dijatuhkan. Solusi alternatif:

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

Seperti yang Anda lihat, ini benar-benar hanya menghapus kolom 0 (pertama 'x').

Saeed
sumber
1
Kamu adalah pahlawan ku. Sedang berusaha memikirkan cara pintar untuk melakukan ini terlalu lama.
ATK7474
5

Anda perlu mengidentifikasi kolom berdasarkan posisi mereka dalam bingkai data. Misalnya, jika Anda ingin menjatuhkan (del) nomor kolom 2,3 dan 5, itu akan menjadi,

df.drop(df.columns[[2,3,5]], axis = 1)
Kripalu Sar
sumber
4

Jika Anda memiliki dua kolom dengan nama yang sama. Salah satu cara sederhana adalah mengubah nama kolom secara manual seperti ini: -

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

Kemudian Anda dapat turun melalui indeks kolom seperti yang Anda minta, seperti ini: -

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

df.column[1] akan turun indeks 1.

Ingat sumbu 1 = kolom dan sumbu 0 = baris.

Cam
sumber
3

jika Anda benar-benar ingin melakukannya dengan bilangan bulat (tapi mengapa?), maka Anda bisa membuat kamus.

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

maka df = df.drop(col_dict[0], 1)akan bekerja sesuai yang diinginkan

sunting: Anda dapat meletakkannya di fungsi yang melakukan itu untuk Anda, meskipun cara ini membuat kamus setiap kali Anda menyebutnya

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)
mkln
sumber
1

Anda dapat menggunakan baris berikut untuk menjatuhkan dua kolom pertama (atau kolom apa pun yang tidak Anda butuhkan):

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

Referensi

Mojtaba Peyrovi
sumber
-1

Karena mungkin ada beberapa kolom dengan nama yang sama, pertama-tama kita harus mengganti nama kolom. Berikut ini kode untuk solusinya.

df.columns=list(range(0,len(df.columns)))
df.drop(columns=[1,2])#drop second and third columns
Guntur
sumber