Ketika menghapus kolom dalam DataFrame, saya menggunakan:
del df['column_name']
Dan ini bekerja dengan baik. Mengapa saya tidak bisa menggunakan yang berikut ini?
del df.column_name
Karena Anda dapat mengakses kolom/Seri sebagai df.column_name
, saya berharap ini bekerja.
Cara terbaik untuk melakukan ini di pandas adalah dengan menggunakan drop
:
df = df.drop('column_name', 1)
di mana 1
adalah nomor sumbu (0
untuk baris dan 1
untuk kolom.)
Untuk menghapus kolom tanpa harus menetapkan kembali df
anda dapat melakukan:
df.drop('column_name', axis=1, inplace=True)
Terakhir, untuk menghapus berdasarkan kolom nomor dan bukan berdasarkan kolom label, cobalah cara ini untuk menghapus, misalnya kolom ke-1, ke-2 dan ke-4:
df = df.drop(df.columns[[0, 1, 3]], axis=1) # df.columns is zero-based pd.Index
Seperti yang sudah Anda duga, sintaksis yang tepat adalah
del df['column_name']
Sulit untuk membuat del df.column_name
bekerja hanya sebagai hasil dari keterbatasan sintaksis dalam Python. del df[nama]
diterjemahkan menjadi df.__delitem__(nama)
di bawah penutup oleh Python.
Gunakan:
columns = ['Col1', 'Col2', ...]
df.drop(columns, inplace=True, axis=1)
Ini akan menghapus satu atau lebih kolom di-tempat. Perhatikan bahwa inplace=True
ditambahkan di panda v0.13 dan tidak't bekerja pada versi yang lebih tua. Anda'd perlu menetapkan hasilnya kembali dalam hal:
df = df.drop(columns, axis=1)
Menghapus pertama, kedua dan keempat kolom:
df.drop(df.columns[[0,1,3]], axis=1, inplace=True)
Menghapus kolom pertama:
df.drop(df.columns[[0]], axis=1, inplace=True)
Ada sebuah parameter opsional inplace
jadi yang asli
data dapat dimodifikasi tanpa membuat salinan.
Kolom pilihan, selain itu, deletion
Menghapus kolom kolom nama
:
df.pop('column-name')
df = DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6]), ('C', [7,8, 9])], orient='index', columns=['one', 'two', 'three'])
cetak df
:
one two three
A 1 2 3
B 4 5 6
C 7 8 9
df.drop(df.kolom[[0]], sumbu=1, inplace=True)
cetak df
:
two three
A 2 3
B 5 6
C 8 9
tiga = df.pop('tiga')
cetak df
:
two
A 2
B 5
C 8
Sebenarnya pertanyaan yang diajukan, tidak terjawab oleh sebagian besar jawaban berikut ini:
del df.column_name
?Pada awalnya, kita perlu memahami masalah, yang mengharuskan kita untuk menyelam ke python sihir metode.
Sebagai Wes poin dalam jawabannya del df['kolom']
maps untuk python metode magic df.__delitem__('kolom')
yang dilaksanakan di panda untuk drop column
Namun, seperti yang ditunjukkan di link di atas tentang python sihir metode:
Pada kenyataannya, del harus hampir tidak pernah digunakan karena keadaan genting di mana hal itu disebut; gunakan dengan hati-hati!
Anda bisa berpendapat bahwa del df['column_name']
tidak boleh digunakan atau mendorong, dan dengan demikian del df.column_name
seharusnya tidak dipertimbangkan.
Namun, dalam teori, del df.column_name
bisa diimplementasikan untuk bekerja di panda menggunakan kode metode magic __delattr__
. Namun hal ini memperkenalkan masalah-masalah tertentu, masalah yang del df['column_name']
pelaksanaan sudah memiliki, tetapi di tingkat yang lebih rendah.
Bagaimana jika saya mendefinisikan sebuah kolom dalam dataframe yang disebut "dtypes" atau "kolom".
Kemudian misalnya saya ingin menghapus kolom ini.
del df.dtypes
akan membuat __delattr__
metode bingung jika harus menghapus "dtypes" atribut atau "dtypes" kolom.
.ix
, .loc
atau .iloc
metode.Anda tidak bisa melakukan del df.column_name
karena panda memiliki cukup liar tumbuh arsitektur yang perlu dipertimbangkan dalam rangka untuk jenis disonansi kognitif tidak terjadi kepada para pengguna.
Don't menggunakan df.column_name, mungkin cukup, tapi hal itu menyebabkan disonansi kognitif
Ada beberapa cara untuk menghapus kolom.
harus Ada satu-dan sebaiknya hanya satu-cara yang jelas untuk melakukannya.
Kolom yang kadang-kadang atribut tetapi kadang-kadang tidak.
kasus-kasus Khusus aren't khusus yang cukup untuk melanggar aturan.
Apakah del df.dtypes
menghapus dtypes atribut atau dtypes kolom?
Dalam menghadapi ambiguitas, menolak godaan untuk menebak.
Sebuah tambahan yang bagus adalah kemampuan untuk drop kolom hanya jika mereka ada. Dengan cara ini anda dapat menutupi lebih lanjut kasus penggunaan, dan itu hanya akan menjatuhkan kolom yang sudah ada dari label yang diberikan:
Cukup tambahkan kesalahan='mengabaikan', misalnya.:
df.drop(['col_name_1', 'col_name_2', ..., 'col_name_N'], inplace=True, axis=1, errors='ignore')
Merupakan praktik yang baik untuk selalu menggunakan notasi []
. Salah satu alasannya adalah bahwa notasi atribut (df.column_name
) tidak bekerja untuk indeks bernomor:
In [1]: df = DataFrame([[1, 2, 3], [4, 5, 6]])
In [2]: df[1]
Out[2]:
0 2
1 5
Name: 1
In [3]: df.1
File "<ipython-input-3-e4803c0d1066>", line 1
df.1
^
SyntaxError: invalid syntax
Di panda 0.16.1+ anda dapat drop kolom hanya jika mereka ada per solusi diposting oleh @eiTanLaVi. Sebelum versi itu, anda dapat mencapai hasil yang sama melalui bersyarat daftar pemahaman:
df.drop([col for col in ['col_name_1','col_name_2',...,'col_name_N'] if col in df],
axis=1, inplace=True)
Panda versi 0.21 telah berubah drop
metode sedikit untuk menyertakan index
dan kolom
parameter untuk mencocokkan tanda tangan nama
dan daftar ulang
metode.
df.drop(columns=['column_a', 'column_c'])
Secara pribadi, saya lebih suka menggunakan axis
parameter untuk menunjukkan kolom atau indeks, karena itu lebih dominan kata kunci parameter yang digunakan dalam hampir semua panda metode. Tapi, sekarang anda telah menambahkan beberapa pilihan dalam versi 0.21.
Banyak usaha untuk menemukan sedikit lebih efisien solusi. Sulit untuk membenarkan menambahkan kompleksitas sementara mengorbankan kesederhanaan df.drop(dlst, 1, kesalahan='mengabaikan')
df.reindex_axis(np.setdiff1d(df.columns.values, dlst), 1)
Pembukaan Menghapus kolom semantik yang sama seperti memilih kolom lainnya. I'll menunjukkan beberapa metode tambahan untuk mempertimbangkan.
I'll juga fokus pada solusi umum dari menghapus beberapa kolom sekaligus dan memungkinkan untuk mencoba untuk menghapus kolom yang tidak hadir.
Menggunakan solusi ini bersifat umum dan akan bekerja untuk kasus sederhana juga.
Pengaturan
Mempertimbangkan pd.DataFrame
df
dan daftar untuk menghapus dlst
df = pd.DataFrame(dict(zip('ABCDEFGHIJ', range(1, 11))), range(3))
dlst = list('HIJKLM')
df
A B C D E F G H I J
0 1 2 3 4 5 6 7 8 9 10
1 1 2 3 4 5 6 7 8 9 10
2 1 2 3 4 5 6 7 8 9 10
dlst
['H', 'I', 'J', 'K', 'L', 'M']
Hasilnya akan terlihat seperti:
df.drop(dlst, 1, errors='ignore')
A B C D E F G
0 1 2 3 4 5 6 7
1 1 2 3 4 5 6 7
2 1 2 3 4 5 6 7
Karena saya'm menyamakan menghapus kolom untuk memilih kolom lain, saya'll memecahnya menjadi dua jenis:
Kita mulai dengan pembuatan daftar/hotel label yang mewakili kolom-kolom yang kita inginkan untuk menjaga dan tanpa kolom yang ingin kita hapus.
df.kolom.perbedaan(dlst)
Index(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype='objek')
np.setdiff1d(df.kolom.nilai-nilai, dlst)
array(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype=obyek)
df.kolom.drop(dlst, kesalahan='mengabaikan')
Index(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype='objek')
daftar(set(df.kolom.nilai-nilai.kedaftar()).perbedaan(dlst))
['E', 'D', 'B', 'F', 'G', 'A', 'C']
[x untuk x di df.kolom.nilai-nilai.kedaftar() jika x tidak di dlst]
['A', 'B', 'C', 'D', 'E', 'F', 'G']
Kolom dari Label Demi membandingkan proses seleksi, misalnya:
cols = [x for x in df.columns.values.tolist() if x not in dlst]
Kemudian kita dapat mengevaluasi
df.loc[:, cols]
df[cols]
df.reindex(kolom=kolom)
df.reindex_axis(cols, 1)
Yang semua untuk mengevaluasi:
A B C D E F G
0 1 2 3 4 5 6 7
1 1 2 3 4 5 6 7
2 1 2 3 4 5 6 7
Kita dapat membuat array/daftar boolean untuk mengiris
~df.kolom.isin(dlst)
~np.in1d(df.kolom.nilai-nilai, dlst)
[x tidak di dlst untuk x di df.kolom.nilai-nilai.kedaftar()]
(df.kolom.nilai-nilai[:, None] != dlst).semua(1)
Kolom dari Boolean Demi perbandingan
bools = [x not in dlst for x in df.columns.values.tolist()]
df.loc[: bools]
Yang semua untuk mengevaluasi:
A B C D E F G
0 1 2 3 4 5 6 7
1 1 2 3 4 5 6 7
2 1 2 3 4 5 6 7
Kuat Waktu
Fungsi
setdiff1d = lambda df, dlst: np.setdiff1d(df.columns.values, dlst)
difference = lambda df, dlst: df.columns.difference(dlst)
columndrop = lambda df, dlst: df.columns.drop(dlst, errors='ignore')
setdifflst = lambda df, dlst: list(set(df.columns.values.tolist()).difference(dlst))
comprehension = lambda df, dlst: [x for x in df.columns.values.tolist() if x not in dlst]
loc = lambda df, cols: df.loc[:, cols]
slc = lambda df, cols: df[cols]
ridx = lambda df, cols: df.reindex(columns=cols)
ridxa = lambda df, cols: df.reindex_axis(cols, 1)
isin = lambda df, dlst: ~df.columns.isin(dlst)
in1d = lambda df, dlst: ~np.in1d(df.columns.values, dlst)
comp = lambda df, dlst: [x not in dlst for x in df.columns.values.tolist()]
brod = lambda df, dlst: (df.columns.values[:, None] != dlst).all(1)
Pengujian
res1 = pd.DataFrame(
index=pd.MultiIndex.from_product([
'loc slc ridx ridxa'.split(),
'setdiff1d difference columndrop setdifflst comprehension'.split(),
], names=['Select', 'Label']),
columns=[10, 30, 100, 300, 1000],
dtype=float
)
res2 = pd.DataFrame(
index=pd.MultiIndex.from_product([
'loc'.split(),
'isin in1d comp brod'.split(),
], names=['Select', 'Label']),
columns=[10, 30, 100, 300, 1000],
dtype=float
)
res = res1.append(res2).sort_index()
dres = pd.Series(index=res.columns, name='drop')
for j in res.columns:
dlst = list(range(j))
cols = list(range(j // 2, j + j // 2))
d = pd.DataFrame(1, range(10), cols)
dres.at[j] = timeit('d.drop(dlst, 1, errors="ignore")', 'from __main__ import d, dlst', number=100)
for s, l in res.index:
stmt = '{}(d, {}(d, dlst))'.format(s, l)
setp = 'from __main__ import d, dlst, {}, {}'.format(s, l)
res.at[(s, l), j] = timeit(stmt, setp, number=100)
rs = res / dres
rs
10 30 100 300 1000
Select Label
loc brod 0.747373 0.861979 0.891144 1.284235 3.872157
columndrop 1.193983 1.292843 1.396841 1.484429 1.335733
comp 0.802036 0.732326 1.149397 3.473283 25.565922
comprehension 1.463503 1.568395 1.866441 4.421639 26.552276
difference 1.413010 1.460863 1.587594 1.568571 1.569735
in1d 0.818502 0.844374 0.994093 1.042360 1.076255
isin 1.008874 0.879706 1.021712 1.001119 0.964327
setdiff1d 1.352828 1.274061 1.483380 1.459986 1.466575
setdifflst 1.233332 1.444521 1.714199 1.797241 1.876425
ridx columndrop 0.903013 0.832814 0.949234 0.976366 0.982888
comprehension 0.777445 0.827151 1.108028 3.473164 25.528879
difference 1.086859 1.081396 1.293132 1.173044 1.237613
setdiff1d 0.946009 0.873169 0.900185 0.908194 1.036124
setdifflst 0.732964 0.823218 0.819748 0.990315 1.050910
ridxa columndrop 0.835254 0.774701 0.907105 0.908006 0.932754
comprehension 0.697749 0.762556 1.215225 3.510226 25.041832
difference 1.055099 1.010208 1.122005 1.119575 1.383065
setdiff1d 0.760716 0.725386 0.849949 0.879425 0.946460
setdifflst 0.710008 0.668108 0.778060 0.871766 0.939537
slc columndrop 1.268191 1.521264 2.646687 1.919423 1.981091
comprehension 0.856893 0.870365 1.290730 3.564219 26.208937
difference 1.470095 1.747211 2.886581 2.254690 2.050536
setdiff1d 1.098427 1.133476 1.466029 2.045965 3.123452
setdifflst 0.833700 0.846652 1.013061 1.110352 1.287831
fig, axes = plt.subplots(2, 2, figsize=(8, 6), sharey=True)
for i, (n, g) in enumerate([(n, g.xs(n)) for n, g in rs.groupby('Select')]):
ax = axes[i // 2, i % 2]
g.plot.bar(ax=ax, title=n)
ax.legend_.remove()
fig.tight_layout()
Ini adalah relatif terhadap waktu yang dibutuhkan untuk menjalankan df.drop(dlst, 1, kesalahan='mengabaikan')
. Sepertinya setelah semua usaha itu, kita hanya akan meningkatkan kinerja sopan.
Jika fakta solusi terbaik menggunakan daftar ulang
atau reindex_axis
di hack daftar(set(df.kolom.nilai-nilai.kedaftar()).perbedaan(dlst))
. Dekat kedua dan masih sangat sedikit lebih baik dari drop
adalah np.setdiff1d
.
rs.idxmin().pipe(
lambda x: pd.DataFrame(
dict(idx=x.values, val=rs.lookup(x.values, x.index)),
x.index
)
)
idx val
10 (ridx, setdifflst) 0.653431
30 (ridxa, setdifflst) 0.746143
100 (ridxa, setdifflst) 0.816207
300 (ridx, setdifflst) 0.780157
1000 (ridxa, setdifflst) 0.861622
Cara lain untuk Menghapus Kolom di Panda DataFrame
jika anda're tidak mencari Di Tempat penghapusan maka anda dapat membuat yang baru DataFrame dengan menentukan kolom menggunakan DataFrame(...)
fungsi sebagai
my_dict = { 'name' : ['a','b','c','d'], 'age' : [10,20,25,22], 'designation' : ['CEO', 'VP', 'MD', 'CEO']}
df = pd.DataFrame(my_dict)
Buat yang baru DataFrame sebagai
newdf = pd.DataFrame(df, columns=['name', 'age'])
Anda mendapatkan hasil yang baik seperti apa yang anda dapatkan dengan del / drop