Saya memiliki DataFrame panda dan saya ingin menghapus baris darinya di mana panjang string dalam kolom tertentu lebih besar dari 2.
Saya berharap dapat melakukan ini (per jawaban ini ):
df[(len(df['column name']) < 2)]
tapi saya baru saja mendapatkan kesalahan:
KeyError: u'no item named False'
Apa yang saya lakukan salah?
(Catatan: Saya tahu saya bisa gunakan df.dropna()
untuk menghilangkan baris yang berisi apa pun NaN
, tapi saya tidak melihat cara menghapus baris berdasarkan ekspresi kondisional.)
df[[(len(x) < 2) for x in df['column name']]]
tetapi Anda jauh lebih baik. Terima kasih atas bantuan Anda!df[df['column name'].map(lambda x: str(x)!=".")]
pandas 0.23.4
python 3.6.copy()
di akhir, jika Anda ingin mengedit dataframe ini nanti (misalnya, menugaskan kolom baru akan menaikkan "Nilai sedang mencoba untuk ditetapkan pada salinan sepotong dari dataFrame" peringatan.Untuk langsung menjawab judul asli pertanyaan ini "Cara menghapus baris dari panda DataFrame berdasarkan ekspresi kondisional" (yang saya pahami belum tentu merupakan masalah OP tetapi dapat membantu pengguna lain menemukan pertanyaan ini) salah satu cara untuk melakukannya adalah menggunakan yang penurunan metode:
df = df.drop(some labels)
df = df.drop(df[<some boolean condition>].index)
Contoh
Untuk menghapus semua baris dengan 'skor' kolom <50:
df = df.drop(df[df.score < 50].index)
Di tempat versi (seperti yang ditunjukkan dalam komentar)
df.drop(df[df.score < 50].index, inplace=True)
Berbagai kondisi
(lihat Boolean Indexing )
Untuk menghapus semua baris dengan 'skor' kolom <50 dan> 20
df = df.drop(df[(df.score < 50) & (df.score > 20)].index)
sumber
reset_index()
). Saya menemukan ini dengan cara yang sulit ketika banyak baris dijatuhkan dari dataframe saya.test = df.drop(df[df['col1'].dtype == str].index)
tetapi saya mendapatkan kesalahanKeyError: False
saya juga mencobadf.drop(df[df.col1.dtype == str].index)
dandf.drop(df[type(df.cleaned_norm_email) == str].index)
tetapi tidak ada yang berhasil? Adakah yang bisa menyarankan. Terima kasih! @ Penggunadf[(df.score < 50) & (df.score > 20)]
sebagai bagian dari jawaban Anda. Jika Anda membalikkan ini,df = df[(df.score >= 50) | (df.score <= 20)]
Anda akan mendapatkan jawaban Anda jauh lebih cepat.Anda dapat menetapkan
DataFrame
untuk versi yang disaring itu sendiri:Ini lebih cepat dari
drop
:sumber
Saya akan memperluas pada solusi generik @ Pengguna untuk memberikan
drop
alternatif gratis. Ini untuk orang-orang yang diarahkan di sini berdasarkan pada judul pertanyaan (bukan masalah OP)Katakanlah Anda ingin menghapus semua baris dengan nilai negatif. Satu solusi liner adalah: -
Langkah demi langkah Penjelasan: -
Mari kita buat kerangka data distribusi normal 5x5 acak
Biarkan kondisinya menghapus negatif. Boolean df memuaskan kondisi: -
Serangkaian boolean untuk semua baris yang memenuhi kondisi Catatan jika ada elemen di baris gagal kondisi baris ditandai salah
Akhirnya menyaring baris dari bingkai data berdasarkan kondisi
Anda dapat menetapkannya kembali ke df untuk benar-benar menghapus vs filter yang dilakukan di atas
df = df[(df > 0).all(axis=1)]
Ini dapat dengan mudah diperluas untuk menyaring baris yang mengandung NaN (entri non numerik): -
df = df[(~df.isnull()).all(axis=1)]
Ini juga dapat disederhanakan untuk kasus-kasus seperti: Hapus semua baris di mana kolom E negatif
Saya ingin mengakhiri dengan beberapa statistik profil tentang mengapa @ Pengguna
drop
solusi lebih lambat daripada penyaringan berbasis kolom mentah: -Sebuah kolom pada dasarnya adalah
Series
yaituNumPy
array, dapat diindeks tanpa biaya apapun. Untuk orang-orang yang tertarik dengan bagaimana organisasi memori yang mendasari bermain dalam kecepatan eksekusi di sini adalah Tautan yang hebat untuk Mempercepat Pandas :sumber
Di panda, Anda bisa melakukannya
str.len
dengan batas Anda dan menggunakan hasil Boolean untuk memfilternya.sumber
Jika Anda ingin menjatuhkan baris bingkai data berdasarkan beberapa kondisi rumit pada nilai kolom kemudian menulis bahwa dengan cara yang ditunjukkan di atas bisa rumit. Saya punya solusi sederhana berikut yang selalu berhasil. Mari kita asumsikan bahwa Anda ingin menjatuhkan kolom dengan 'tajuk' jadi dapatkan kolom itu dalam daftar terlebih dahulu.
sekarang terapkan beberapa fungsi pada setiap elemen daftar dan letakkan di dalam seri panda:
dalam kasus saya, saya hanya mencoba untuk mendapatkan jumlah token:
sekarang tambahkan satu kolom tambahan dengan seri di atas dalam bingkai data:
sekarang kita dapat menerapkan kondisi pada kolom baru seperti:
sumber