Saat menghapus kolom dalam DataFrame yang saya gunakan:
del df['column_name']
Dan ini bekerja dengan baik. Mengapa saya tidak bisa menggunakan yang berikut ini?
del df.column_name
Karena dimungkinkan untuk mengakses kolom / Seri sebagai df.column_name
, saya berharap ini berfungsi.
Jawaban:
Seperti yang sudah Anda tebak, sintaks yang tepat adalah
Sulit untuk membuat
del df.column_name
pekerjaan hanya sebagai hasil dari keterbatasan sintaksis dalam Python.del df[name]
diterjemahkan kedf.__delitem__(name)
bawah selimut oleh Python.sumber
class A(object): def __init__(self): self.var = 1
membuat kelas, lalua = A(); del a.var
bekerja dengan baik ...del df[name]
, itu akan diterjemahkandf.__delitem__(name)
yang merupakan metode yang DataFrame dapat menerapkan dan memodifikasi untuk kebutuhannya. Dalam kasusdel df.name
, variabel anggota dihapus tanpa peluang untuk menjalankan kode kustom. Pertimbangkan contoh Anda sendiri - dapatkah Andadel a.var
menghasilkan cetakan "menghapus variabel"? Jika Anda bisa, tolong beri tahu saya caranya. Saya tidak bisa :)pandas
pengembang tidak , tetapi itu tidak berarti sulit untuk dilakukan.Cara terbaik untuk melakukan ini dalam panda adalah dengan menggunakan
drop
:di mana
1
adalah sumbu nomor (0
untuk baris dan1
untuk kolom.)Untuk menghapus kolom tanpa harus ditugaskan kembali,
df
Anda dapat melakukan:Terakhir, untuk menghapus dengan nomor kolom alih-alih dengan label kolom , coba ini untuk menghapus, misalnya kolom 1, 2 dan 4:
Juga bekerja dengan sintaks "teks" untuk kolom:
sumber
del
karena beberapa alasan?drop
atasdel
adalah bahwadrop
memungkinkan Anda untuk drop beberapa kolom sekaligus, melakukan inplace operasi atau tidak, dan catatan juga menghapus sepanjang sumbu (terutama berguna untuk matriks 3-D atauPanel
)drop
overdel
adalah bahwa drop adalah bagian dari API panda dan berisi dokumentasi.Menggunakan:
Ini akan menghapus satu atau lebih kolom di tempat. Catatan yang
inplace=True
ditambahkan dalam panda v0.13 dan tidak akan berfungsi pada versi yang lebih lama. Anda harus menetapkan hasilnya kembali dalam kasus itu:sumber
df.drop(list,inplace=True,axis=1)
del
- dapat menjatuhkan lebih dari satu kolom sekaligus.Drop by index
Hapus kolom pertama, kedua, dan keempat:
Hapus kolom pertama:
Ada parameter opsional
inplace
sehingga data asli dapat dimodifikasi tanpa membuat salinan.Muncul
Pemilihan kolom, penambahan, penghapusan
Hapus kolom
column-name
:Contoh:
print df
:df.drop(df.columns[[0]], axis=1, inplace=True)
print df
:three = df.pop('three')
print df
:sumber
df.T.pop('A')
df
. Anda bisa melakukannyadf = df.T; df.pop(index); df = df.T
tetapi ini tampaknya berlebihan.df.drop(df.columns[[0]], axis=1, inplace=True)
tidak cukup untuk digunakandf.drop([0], axis=1)
?0
, makadf.drop(0, axis=1)
berfungsi dengan baik. Tetapi jika tidak tahu nama kolom dan perlu menghapus kolom pertama maka perludf.drop(df.columns[[0]], axis=1, inplace=True)
, itu memilih kolom pertama dengan posisi dan menjatuhkannya.Pertanyaan aktual yang diajukan, terlewatkan oleh sebagian besar jawaban di sini adalah:
Kenapa saya tidak bisa menggunakan
del df.column_name
?Pada awalnya kita perlu memahami masalahnya, yang mengharuskan kita untuk menyelami metode sulap python .
Seperti yang Wes tunjukkan dalam jawabannya
del df['column']
memetakan metode sulap pythondf.__delitem__('column')
yang diimplementasikan dalam panda untuk menjatuhkan kolomNamun, seperti yang ditunjukkan pada tautan di atas tentang metode sulap python :
Anda bisa berargumen bahwa
del df['column_name']
tidak boleh digunakan atau didorong, dan dengan demikiandel df.column_name
seharusnya tidak dipertimbangkan.Namun, dalam teori,
del df.column_name
dapat implemeted untuk bekerja di panda menggunakan satu metode magic__delattr__
. Namun hal ini menimbulkan masalah-masalah tertentu, masalah-masalah yangdel df['column_name']
sudah dimiliki oleh implementasi, tetapi pada tingkat yang lebih rendah.Contoh Masalah
Bagaimana jika saya mendefinisikan kolom dalam kerangka data yang disebut "dtypes" atau "kolom".
Kemudian anggap saya ingin menghapus kolom ini.
del df.dtypes
akan membuat__delattr__
metode bingung seolah-olah harus menghapus atribut "dtypes" atau kolom "dtypes".Pertanyaan arsitektur di balik masalah ini
Jawaban Panda:
.ix
,.loc
atau.iloc
metode.TLDR;
Anda tidak dapat melakukannya
del df.column_name
karena panda memiliki arsitektur yang tumbuh sangat liar yang perlu dipertimbangkan kembali agar disonansi kognitif semacam ini tidak terjadi pada penggunanya.Protip:
Jangan gunakan df.column_name, Ini mungkin cukup, tetapi menyebabkan disonansi kognitif
Kutipan Zen dari Python yang cocok di sini:
Ada beberapa cara menghapus kolom.
Kolom terkadang atribut tetapi terkadang tidak.
Apakah
del df.dtypes
menghapus atribut dtypes atau kolom dtypes?sumber
__del__
seharusnya hampir tidak pernah digunakan karena keadaan genting di mana ia dipanggil; gunakan dengan hati-hati!" sama sekali tidak relevan di sini, karena metode yang digunakan di sini adalah__delattr__
.del
builtin yang dimaksud, bukan.__del__
metode instance. Thedel
builtin adalah pemetaan untuk__delattr__
dan__delitem__
yang adalah apa yang saya membangun argumen saya. Jadi mungkin Anda ingin membaca kembali apa yang saya tulis.__
...__
diinterpretasikan sebagai markup tebal oleh StackExchangeTambahan yang bagus adalah kemampuan untuk menjatuhkan kolom hanya jika ada . Dengan cara ini Anda dapat mencakup lebih banyak kasus penggunaan, dan itu hanya akan menjatuhkan kolom yang ada dari label yang diteruskan ke sana:
Cukup tambahkan kesalahan = 'abaikan' , misalnya .:
sumber
dari versi 0.16.1 dapat Anda lakukan
sumber
errors= 'ignore'
)df.drop(['column_1','column_2'], axis=1 , inplace=True,errors= 'ignore')
, jika aplikasi seperti itu diinginkan!Ini praktik yang baik untuk selalu menggunakan
[]
notasi. Salah satu alasannya adalah bahwa notasi atribut (df.column_name
) tidak berfungsi untuk indeks bernomor:sumber
Panda 0,21+ menjawab
Pandas versi 0.21 telah
drop
sedikit mengubah metode untuk memasukkan kedua parameterindex
dancolumns
untuk mencocokkan tanda tanganrename
danreindex
metode.Secara pribadi, saya lebih suka menggunakan
axis
parameter untuk menunjukkan kolom atau indeks karena itu adalah parameter kata kunci utama yang digunakan di hampir semua metode panda. Tapi, sekarang Anda memiliki beberapa pilihan tambahan di versi 0.21.sumber
Di panda 0.16.1+ Anda dapat menjatuhkan kolom hanya jika ada per solusi yang diposting oleh @eiTanLaVi. Sebelum versi itu, Anda dapat mencapai hasil yang sama melalui pemahaman daftar bersyarat:
sumber
TL; DR
Banyak upaya untuk menemukan solusi yang sedikit lebih efisien. Sulit untuk membenarkan kerumitan yang ditambahkan sambil mengorbankan kesederhanaan
df.drop(dlst, 1, errors='ignore')
Pembukaan
Menghapus kolom secara semantik sama dengan memilih kolom lainnya. Saya akan menunjukkan beberapa metode tambahan untuk dipertimbangkan.
Saya juga akan fokus pada solusi umum menghapus beberapa kolom sekaligus dan memungkinkan upaya untuk menghapus kolom yang tidak ada.
Menggunakan solusi ini bersifat umum dan akan berfungsi untuk kasus sederhana juga.
Pengaturan
Pertimbangkan
pd.DataFrame
df
dan daftar untuk dihapusdlst
Hasilnya harus seperti:
Karena saya menyamakan menghapus kolom untuk memilih kolom lainnya, saya akan memecahnya menjadi dua jenis:
Pemilihan Label
Kita mulai dengan membuat daftar / array label yang mewakili kolom yang ingin kita pertahankan dan tanpa kolom yang ingin kita hapus.
df.columns.difference(dlst)
np.setdiff1d(df.columns.values, dlst)
df.columns.drop(dlst, errors='ignore')
list(set(df.columns.values.tolist()).difference(dlst))
[x for x in df.columns.values.tolist() if x not in dlst]
Kolom dari Label
Demi membandingkan proses seleksi, asumsikan:
Maka kita bisa mengevaluasi
df.loc[:, cols]
df[cols]
df.reindex(columns=cols)
df.reindex_axis(cols, 1)
Yang semuanya dievaluasi untuk:
Boolean Slice
Kita dapat membuat array / daftar boolean untuk diiris
~df.columns.isin(dlst)
~np.in1d(df.columns.values, dlst)
[x not in dlst for x in df.columns.values.tolist()]
(df.columns.values[:, None] != dlst).all(1)
Kolom dari Boolean
Demi perbandingan
df.loc[: bools]
Yang semuanya dievaluasi untuk:
Pengaturan waktu yang kuat
Fungsi
Pengujian
Ini relatif terhadap waktu yang diperlukan untuk menjalankan
df.drop(dlst, 1, errors='ignore')
. Sepertinya setelah semua upaya itu, kami hanya meningkatkan kinerja secara sederhana.Jika faktanya solusi terbaik gunakan
reindex
ataureindex_axis
di retaslist(set(df.columns.values.tolist()).difference(dlst))
. Yang kedua dekat dan masih sangat sedikit lebih baik daridrop
itunp.setdiff1d
.sumber
Sintaks dot berfungsi dalam JavaScript, tetapi tidak dalam Python.
del df['column_name']
del df['column_name']
ataudel df.column_name
sumber
Jika kerangka data asli Anda
df
tidak terlalu besar, Anda tidak memiliki kendala memori, dan Anda hanya perlu menyimpan beberapa kolom maka Anda mungkin juga membuat kerangka data baru dengan hanya kolom yang Anda butuhkan:sumber
Kita dapat menghapus atau menghapus kolom yang ditentukan atau kolom yang ditandai dengan metode drop () .
Misalkan df adalah kerangka data.
Kolom yang akan dihapus = kolom0
Untuk menghapus beberapa kolom, col1, col2,. . . , coln, kita harus memasukkan semua kolom yang perlu dihapus dalam daftar. Kemudian hapus dengan metode drop ().
Saya harap ini akan membantu.
sumber
df = df.drop([col1, col2, . . . , coln], axis=1)
ini tidak berfungsi jika saya menentukan nama variabel di tempat col1, col2 dll. Saya mendapatkan kolom kesalahan tidak dalam sumbu ketika pasti hadir. @Littin Bisakah Anda membantu?Cara lain Menghapus Kolom di Pandas DataFrame
jika Anda tidak mencari penghapusan In-Place maka Anda dapat membuat DataFrame baru dengan menentukan kolom menggunakan
DataFrame(...)
fungsi sebagaiBuat DataFrame baru sebagai
Anda mendapatkan hasil sebagus apa yang Anda dapatkan dengan del / drop
sumber