Saya memiliki beberapa data dan ketika saya mengimpornya saya mendapatkan kolom yang tidak dibutuhkan berikut ini, saya mencari cara mudah untuk menghapus semua ini
'Unnamed: 24', 'Unnamed: 25', 'Unnamed: 26', 'Unnamed: 27',
'Unnamed: 28', 'Unnamed: 29', 'Unnamed: 30', 'Unnamed: 31',
'Unnamed: 32', 'Unnamed: 33', 'Unnamed: 34', 'Unnamed: 35',
'Unnamed: 36', 'Unnamed: 37', 'Unnamed: 38', 'Unnamed: 39',
'Unnamed: 40', 'Unnamed: 41', 'Unnamed: 42', 'Unnamed: 43',
'Unnamed: 44', 'Unnamed: 45', 'Unnamed: 46', 'Unnamed: 47',
'Unnamed: 48', 'Unnamed: 49', 'Unnamed: 50', 'Unnamed: 51',
'Unnamed: 52', 'Unnamed: 53', 'Unnamed: 54', 'Unnamed: 55',
'Unnamed: 56', 'Unnamed: 57', 'Unnamed: 58', 'Unnamed: 59',
'Unnamed: 60'
Mereka diindeks oleh 0-indexing jadi saya mencoba sesuatu seperti
df.drop(df.columns[[22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32 ,55]], axis=1, inplace=True)
Tapi ini tidak terlalu efisien. Saya mencoba menulis beberapa untuk loop tetapi ini menurut saya sebagai perilaku Panda yang buruk. Karenanya saya mengajukan pertanyaan di sini.
Saya telah melihat beberapa contoh yang serupa ( Jatuhkan beberapa kolom panda ) tetapi ini tidak menjawab pertanyaan saya.
df.drop
daftar nama kolom:df.drop(['Unnamed: 24', 'Unnamed: 25', ...], axis=1)
df = df[cols_of_interest]
, jika tidak, Anda dapat memotong df menurut kolom dan mendapatkan kolomnyadf.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)
Jawaban:
Saya tidak tahu apa yang Anda maksud dengan tidak efisien tetapi jika yang Anda maksud dalam hal mengetik, bisa lebih mudah untuk hanya memilih kolom yang diminati dan menetapkan kembali ke df:
Di mana
cols_of_interest
daftar kolom yang Anda pedulikan.Atau Anda dapat memotong kolom dan meneruskannya ke
drop
:df.drop(df.ix[:,'Unnamed: 24':'Unnamed: 60'].head(0).columns, axis=1)
Panggilan untuk
head
hanya memilih 0 baris karena kami hanya tertarik pada nama kolom daripada datamemperbarui
Metode lain: Akan lebih mudah untuk menggunakan boolean mask
str.contains
dan membalikkannya untuk menutupi kolom:In [2]: df = pd.DataFrame(columns=['a','Unnamed: 1', 'Unnamed: 1','foo']) df Out[2]: Empty DataFrame Columns: [a, Unnamed: 1, Unnamed: 1, foo] Index: [] In [4]: ~df.columns.str.contains('Unnamed:') Out[4]: array([ True, False, False, True], dtype=bool) In [5]: df[df.columns[~df.columns.str.contains('Unnamed:')]] Out[5]: Empty DataFrame Columns: [a, foo] Index: []
sumber
df
dengan kolom baru Anda, Andaappend
mungkin harus tetapi saya tidak benar-benar memahami pertanyaan Anda, Anda harus memposting pertanyaan nyata di SO daripada bertanya sebagai komentar karena itu formulir yang buruk di SOSejauh ini pendekatan yang paling sederhana adalah:
yourdf.drop(['columnheading1', 'columnheading2'], axis=1, inplace=True)
sumber
SettingWithCopyWarning
peringatan?axis
menjelaskan: stackoverflow.com/questions/22149584/… . Pada dasarnya,axis=0
dikatakan "bijaksana kolom" danaxis=1
"bijaksana baris".inplace=True
berartiDataFrame
sudah dimodifikasi di tempat.yourdf = yourdf.drop(['columnheading1', 'columnheading2'], axis=1)
Favorit pribadi saya, dan lebih mudah daripada jawaban yang saya lihat di sini (untuk beberapa kolom):
df.drop(df.columns[22:56], axis=1, inplace=True)
Atau membuat daftar untuk beberapa kolom.
col = list(df.columns)[22:56] df.drop(col, axis=1, inplace=1)
sumber
Ini mungkin cara yang baik untuk melakukan apa yang Anda inginkan. Ini akan menghapus semua kolom yang berisi 'Unnamed' di headernya.
for col in df.columns: if 'Unnamed' in col: del df[col]
sumber
for col in df.columns:
dapat disederhanakanfor col in df:
, juga OP belum menunjukkan skema penamaan apa untuk kolom lain, semuanya dapat berisi 'Tanpa Nama', juga ini tidak efisien karena menghapus kolom satu per satuinplace = True
Anda dapat melakukan ini dalam satu baris dan sekali jalan:
df.drop([col for col in df.columns if "Unnamed" in col], axis=1, inplace=True)
Ini melibatkan lebih sedikit pergerakan / penyalinan objek daripada solusi di atas.
sumber
Tidak yakin apakah solusi ini telah disebutkan di mana saja tetapi salah satu cara untuk melakukannya adalah
pandas.Index.difference
.>>> df = pd.DataFrame(columns=['A','B','C','D']) >>> df Empty DataFrame Columns: [A, B, C, D] Index: [] >>> to_remove = ['A','C'] >>> df = df[df.columns.difference(to_remove)] >>> df Empty DataFrame Columns: [B, D] Index: []
sumber
Anda bisa meneruskan nama kolom sebagai daftar dengan menentukan sumbu sebagai 0 atau 1
Secara default sumbu = 0
data.drop(["Colname1","Colname2","Colname3","Colname4"],axis=1)
sumber
Sederhana dan Mudah. Hapus semua kolom setelah tanggal 22.
df.drop(columns=df.columns[22:]) # love it
sumber
df
di tempat, tambahkan benderainplace=True
, Sehinggadf.drop(columns=df.columns[22:], inplace=True)
Di bawah ini berhasil untuk saya:
for col in df: if 'Unnamed' in col: #del df[col] print col try: df.drop(col, axis=1, inplace=True) except Exception: pass
sumber
df = df[[col for col in df.columns if not ('Unnamed' in col)]]
sumber