Pertanyaan Hapus kolom dari pandas DataFrame menggunakan del df.column_name


Saat menghapus kolom dalam DataFrame yang saya gunakan:

del df['column_name']

Dan ini berfungsi dengan baik. Mengapa saya tidak bisa menggunakan yang berikut ini?

del df.column_name

Karena Anda dapat mengakses kolom / Seri sebagai df.column_nameSaya berharap ini bekerja.


814
2017-11-16 06:26


asal


Jawaban:


Sulit untuk membuatnya del df.column_name bekerja hanya sebagai hasil dari keterbatasan sintaksis dalam Python. del df[name] diterjemahkan ke df.__delitem__(name) di bawah selimut oleh Python.


463
2017-11-21 03:12



Cara terbaik untuk melakukan ini di panda adalah menggunakan drop:

df = df.drop('column_name', 1)

dimana 1 adalah sumbu angka (0 untuk baris dan 1 untuk kolom.)

Untuk menghapus kolom tanpa harus menetapkan ulang df Anda dapat melakukan:

df.drop('column_name', axis=1, inplace=True)

Akhirnya, mampir ke kolom jumlah bukannya dengan kolom label, coba ini untuk menghapus, mis. kolom 1, 2 dan 4:

df.drop(df.columns[[0, 1, 3]], axis=1)  # df.columns is zero-based pd.Index 

1529
2017-08-09 11:12



Menggunakan:

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

Ini akan menghapus satu atau beberapa kolom di tempat. Perhatikan itu inplace=True ditambahkan di panda v0.13 dan tidak berfungsi pada versi yang lebih lama. Anda harus menetapkan hasilnya kembali dalam kasus itu:

df = df.drop(columns, axis=1)

178
2018-03-23 20:57



Jatuhkan berdasarkan indeks

Hapus kolom pertama, kedua, dan keempat:

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

Hapus kolom pertama:

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

Ada parameter opsional inplace jadi yang asli data dapat dimodifikasi tanpa membuat salinan.

Muncul

Pemilihan kolom, penambahan, penghapusan

Hapus kolom column-name:

df.pop('column-name')

Contoh:

df = DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6]), ('C', [7,8, 9])], orient='index', columns=['one', 'two', 'three'])

print df:

   one  two  three
A    1    2      3
B    4    5      6
C    7    8      9

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

   two  three
A    2      3
B    5      6
C    8      9

three = df.pop('three') print df:

   two
A    2
B    5
C    8

78
2017-07-15 13:37



Pertanyaan sebenarnya yang diajukan, terlewatkan oleh sebagian besar jawaban di sini adalah:

Mengapa saya tidak bisa menggunakannya del df.column_name?

Pada awalnya kita perlu memahami masalahnya, yang mengharuskan kita untuk menyelami metode sulap python.

Sebagaimana Wes tunjukkan dalam jawabannya del df['column'] memetakan ke python metode sihir  df.__delitem__('column') yang mana diimplementasikan dalam panda untuk menjatuhkan kolom

Namun, seperti yang ditunjukkan di tautan di atas metode sulap python:

Faktanya, del hampir tidak boleh digunakan karena keadaan genting di mana hal itu disebut; gunakan dengan hati-hati!

Anda bisa membantah itu del df['column_name'] tidak boleh digunakan atau didorong, dan dengan demikian del df.column_name seharusnya tidak dipertimbangkan.

Namun, secara teori, del df.column_name bisa diterapkan untuk bekerja di panda menggunakan itu metode sihir __delattr__. Namun ini memperkenalkan masalah tertentu, masalah yang del df['column_name'] implementasi sudah memiliki, tetapi dalam tingkat yang lebih rendah.

Contoh Soal

Bagaimana jika saya mendefinisikan kolom dalam dataframe yang disebut "dtypes" atau "columns".

Lalu asumsikan saya ingin menghapus kolom-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

  1. Adalah dataframe a koleksi kolom?
  2. Merupakan kumpulan data kumpulan baris?
  3. Apakah kolom an atribut dari dataframe?

Pandas menjawab:

  1. Ya, dalam segala hal
  2. Tidak, tetapi jika Anda menginginkannya, Anda dapat menggunakan .ix, .loc atau .iloc metode.
  3. Mungkin, kamu mau Baca baca data? Kemudian iya nih, kecuali kalau nama atribut sudah diambil oleh atribut lain yang termasuk dalam dataframe. Apakah kamu mau memodifikasi data? Kemudian tidak.

TLDR;

Anda tidak bisa melakukannya del df.column_name karena panda memiliki arsitektur yang tumbuh sangat liar yang perlu dipertimbangkan kembali untuk jenis ini disonansi kognitif tidak terjadi pada penggunanya.

Protip:

Jangan gunakan df.column_name, Ini mungkin cukup, tetapi itu menyebabkan disonansi kognitif

Kutipan Zen dari Python yang cocok di sini:

Ada beberapa cara untuk menghapus kolom.

Harus ada satu - dan sebaiknya hanya satu - cara yang jelas untuk melakukannya.

Kolom kadang-kadang atribut tetapi kadang-kadang tidak.

Kasus khusus tidak cukup khusus untuk melanggar peraturan.

Apakah del df.dtypes hapus atribut dtypes atau kolom dtypes?

Dalam menghadapi ambiguitas, tolak godaan untuk menebak.


54
2018-05-03 09:48



dari versi 0.16.1 dapat Anda lakukan

df.drop(['column_name'], axis = 1, inplace = True, errors = 'ignore')

37
2018-04-30 18:57



Tambahan yang bagus adalah kemampuan untuk jatuhkan kolom hanya jika ada. Dengan cara ini Anda dapat menutupi lebih banyak kasus penggunaan, dan itu hanya akan menjatuhkan kolom yang ada dari label yang diteruskan ke sana:

Cukup tambahkan kesalahan = 'abaikan', sebagai contoh.:

df.drop(['col_name_1', 'col_name_2', ..., 'col_name_N'], inplace=True, axis=1, errors='ignore')
  • Ini baru dari panda 0,16.1 dan seterusnya. Dokumentasi adalah sini.

37
2018-01-03 12:29



Ini praktik yang baik untuk selalu menggunakan [] notasi. Salah satu alasannya adalah bahwa notasi atribut (df.column_name) tidak berfungsi 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

24
2017-11-16 11:33



Di panda 0.16.1+ Anda dapat menghapus kolom hanya jika ada per solusi yang diposkan oleh @eiTanLaVi. Sebelum versi itu, Anda dapat mencapai hasil yang sama melalui pemahaman daftar bersyarat:

df.drop([col for col in ['col_name_1','col_name_2',...,'col_name_N'] if col in df], 
        axis=1, inplace=True)

20
2018-02-13 21:58