Bagaimana cara memilih semua kolom, kecuali satu kolom di panda?

280

Saya memiliki tampilan data seperti ini:

import pandas
import numpy as np
df = DataFrame(np.random.rand(4,4), columns = list('abcd'))
df
      a         b         c         d
0  0.418762  0.042369  0.869203  0.972314
1  0.991058  0.510228  0.594784  0.534366
2  0.407472  0.259811  0.396664  0.894202
3  0.726168  0.139531  0.324932  0.906575

Bagaimana saya bisa mendapatkan semua kolom kecuali column b?

markov zain
sumber
@ cs95 - Target duplikat yang saat ini tercantum bukan duplikat. Terlepas dari judul aslinya, pertanyaan terkait adalah "Mengapa sintaksis khusus ini tidak berfungsi", sedangkan pertanyaan ini lebih umum "Apa cara terbaik untuk melakukan ini". - Tambahkan ke ini perbedaan antara menghapus kolom dari DataFrame yang ada versus membuat DataFrame baru dengan semua-tapi-satu dari kolom yang lain.
RM
@RM Maaf, tapi saya tidak setuju dengan hasil edit yang Anda buat pada judul pada posting itu, jadi saya memutar kembali. Memang benar bahwa maksud OP adalah untuk mempertanyakan sintaks, tetapi pos telah berkembang untuk menjawab pertanyaan yang lebih luas tentang cara menghapus kolom. Jawaban dalam posting ini adalah salinan karbon dari posting yang paling tinggi di sana. Korban tetap.
cs95
Perhatikan pertanyaan ini sedang dibahas di Meta .
Monyet Sesat

Jawaban:

422

Ketika kolom bukan MultiIndex, df.columnshanya array nama kolom sehingga Anda dapat melakukannya:

df.loc[:, df.columns != 'b']

          a         c         d
0  0.561196  0.013768  0.772827
1  0.882641  0.615396  0.075381
2  0.368824  0.651378  0.397203
3  0.788730  0.568099  0.869127
Marius
sumber
13
Tidak buruk, tetapi menggunakan solusi @ mike dropadalah IMO yang lebih baik. Sedikit lebih mudah dibaca dan menangani multiindex
travc
5
Saya sebenarnya setuju bahwa menggunakan solusi @ mike droplebih baik - saya pikir itu berguna untuk menemukan bahwa kolom (level tunggal) adalah array yang dapat Anda gunakan, tetapi khusus untuk menjatuhkan kolom, dropsangat mudah dibaca dan bekerja dengan baik dengan indeks kompleks.
Marius
1
Terima kasih atas jawaban serakah ini. bagaimana jika saya tidak memiliki header? bagaimana saya alamat?
FabioSpaghetti
1
Bagaimana bila Anda memiliki lebih dari 1 kolom untuk diabaikan?
Bruno Ambrozio
@Marius Apakah ini berfungsi dengan beberapa kolom (katakan dua)?
MasayoMusic
228

Jangan gunakan ix. Sudah usang . Cara yang paling mudah dibaca dan idiomatis untuk melakukan ini adalah df.drop():

>>> df

          a         b         c         d
0  0.175127  0.191051  0.382122  0.869242
1  0.414376  0.300502  0.554819  0.497524
2  0.142878  0.406830  0.314240  0.093132
3  0.337368  0.851783  0.933441  0.949598

>>> df.drop('b', axis=1)

          a         c         d
0  0.175127  0.382122  0.869242
1  0.414376  0.554819  0.497524
2  0.142878  0.314240  0.093132
3  0.337368  0.933441  0.949598

Perhatikan bahwa secara default, .drop()tidak beroperasi di tempat; meskipun nama yang menyenangkan, dftidak terluka oleh proses ini. Jika Anda ingin menghapus secara permanen bdari df, lakukan df.drop('b', inplace=True).

df.drop()juga menerima daftar label, misalnya df.drop(['a', 'b'], axis=1)akan turun kolom adan b.

Mike
sumber
1
Juga berfungsi pada multiindex seperti yang Anda harapkan. df.drop([('l1name', 'l2name'), 'anotherl1name'], axis=1). Tampaknya menggunakan daftar vs tupel untuk menentukan apakah Anda ingin beberapa kolom (daftar) atau merujuk ke multiindex (tupel).
travc
16
Lebih mudah dibaca: df.drop(columns='a')atau df.drop(columns=['a', 'b']). Bisa juga ganti columns=dengan index=.
BallpointBen
Namun ini tidak berguna jika Anda tidak tahu nama semua kolom yang ingin Anda jatuhkan.
yeliabsalohcin
1
Karena ini membuat salinan dan bukan tampilan / referensi, Anda tidak dapat mengubah kerangka data asli dengan menggunakan ini pada LHS dari suatu tugas.
Jan Christoph Terasa
@JanChristophTerasa Apakah Anda tahu cara memodifikasi kolom yang dipilih dalam df asli (seperti kalikan semua kolom ini dengan nilai-nilai kolom lain). Jika saya memodifikasi nilai-nilai ini saya perlu menempel pada kolom yang dijatuhkan di bagian akhir yang sepertinya bukan cara terbaik.
MasayoMusic
132
df[df.columns.difference(['b'])]

Out: 
          a         c         d
0  0.427809  0.459807  0.333869
1  0.678031  0.668346  0.645951
2  0.996573  0.673730  0.314911
3  0.786942  0.719665  0.330833
ayhan
sumber
9
Saya suka pendekatan ini karena dapat digunakan untuk menghilangkan lebih dari satu kolom.
Nischal Hp
3
@NischalHp df.drop juga dapat menghilangkan lebih dari satu kolom df.drop (['a', 'b'], sumbu = 1)
Patrick Li
2
Saya pikir perlu dicatat bahwa ini dapat mengatur ulang kolom Anda
ocean800
1
@ ocean800 Ya itu benar. Anda dapat lulus sort=Falsejika Anda ingin menghindari perilaku itu ( df.columns.difference(['b'], sort=False))
ayhan
65

Kamu bisa memakai df.columns.isin()

df.loc[:, ~df.columns.isin(['b'])]

Saat Anda ingin menjatuhkan beberapa kolom, sesederhana:

df.loc[:, ~df.columns.isin(['col1', 'col2'])]
Tom
sumber
12

Ini cara lain:

df[[i for i in list(df.columns) if i != '<your column>']]

Anda hanya melewati semua kolom yang akan ditampilkan kecuali yang tidak Anda inginkan.

Salvador Dali
sumber
5

Sedikit modifikasi ke @Salvador Dali memungkinkan daftar kolom untuk dikecualikan:

df[[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]

atau

df.loc[:,[i for i in list(df.columns) if i not in [list_of_columns_to_exclude]]]
pengguna1718097
sumber
4

Saya pikir cara terbaik untuk dilakukan adalah cara yang disebutkan oleh @Salvador Dali. Bukannya yang lain salah.

Karena ketika Anda memiliki kumpulan data di mana Anda hanya ingin memilih satu kolom dan memasukkannya ke dalam satu variabel dan sisanya dari kolom ke yang lain untuk tujuan perbandingan atau komputasi. Kemudian menjatuhkan kolom set data mungkin tidak membantu. Tentu saja ada kasus penggunaan untuk itu juga.

x_cols = [x for x in data.columns if x != 'name of column to be excluded']

Kemudian Anda dapat menempatkan kumpulan kolom dalam variabel x_colske variabel lain seperti x_cols1untuk perhitungan lainnya.

ex: x_cols1 = data[x_cols]
Sudhi
sumber
Bisakah Anda menjelaskan mengapa ini adalah jawaban yang terpisah dan bukan komentar / ekstensi untuk jawaban Salvador?
3

Berikut ini adalah lambda satu baris:

df[map(lambda x :x not in ['b'], list(df.columns))]

sebelum :

import pandas
import numpy as np
df = pd.DataFrame(np.random.rand(4,4), columns = list('abcd'))
df

       a           b           c           d
0   0.774951    0.079351    0.118437    0.735799
1   0.615547    0.203062    0.437672    0.912781
2   0.804140    0.708514    0.156943    0.104416
3   0.226051    0.641862    0.739839    0.434230

setelah :

df[map(lambda x :x not in ['b'], list(df.columns))]

        a          c          d
0   0.774951    0.118437    0.735799
1   0.615547    0.437672    0.912781
2   0.804140    0.156943    0.104416
3   0.226051    0.739839    0.434230
Grant Shannon
sumber