Saya memiliki DataFrame dengan banyak nilai yang hilang di kolom yang ingin saya kelompokkan:
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': ['1', '2', '3'], 'b': ['4', np.NaN, '6']})
In [4]: df.groupby('b').groups
Out[4]: {'4': [0], '6': [2]}
melihat bahwa Panda telah menjatuhkan baris dengan nilai target NaN. (Saya ingin memasukkan baris ini!)
Karena saya memerlukan banyak operasi seperti itu (banyak cols memiliki nilai yang hilang), dan menggunakan fungsi yang lebih rumit daripada hanya median (biasanya hutan acak), saya ingin menghindari penulisan potongan kode yang terlalu rumit.
Ada saran? Haruskah saya menulis fungsi untuk ini atau apakah ada solusi sederhana?
dropna=False
dalamgroupby()
untuk mendapatkan hasil yang Anda inginkan. Info lebih lanjutJawaban:
Ini disebutkan di bagian Data Hilang dari dokumen :
Salah satu solusinya adalah menggunakan placeholder sebelum melakukan groupby (misalnya -1):
Yang mengatakan, ini terasa hack yang cukup mengerikan ... mungkin harus ada opsi untuk memasukkan NaN dalam groupby (lihat masalah github ini - yang menggunakan hack placeholder yang sama).
sumber
Topik kuno, jika seseorang masih menemukan ini - solusi lain adalah mengonversi melalui .astype (str) ke string sebelum pengelompokan. Itu akan menghemat NaN.
sumber
sum
daria
adalah penggabungan string di sini, bukan jumlah numerik. Ini hanya "berfungsi" karena 'b' terdiri dari entri yang berbeda. Anda perlu 'a' menjadi numerik dan 'b' menjadi stringpanda> = 1.1
Dari panda 1.1 Anda akan memiliki kontrol yang lebih baik atas perilaku ini, nilai-nilai NA sekarang diizinkan dalam kerapu menggunakan
dropna=False
:Anda dapat menginstal versi pra-rilis v1.1 menggunakan perintah berikut:
sumber
Saya tidak dapat menambahkan komentar ke M. Kiewisch karena saya tidak memiliki poin reputasi yang cukup (hanya memiliki 41 tetapi perlu lebih dari 50 untuk berkomentar).
Bagaimanapun, hanya ingin menunjukkan bahwa solusi M. Kiewisch tidak berfungsi sebagaimana mestinya dan mungkin perlu lebih banyak tweaker. Pertimbangkan misalnya
yang menunjukkan bahwa untuk grup b = 4.0, nilai yang sesuai adalah 15 bukannya 6. Di sini ia hanya merangkai 1 dan 5 sebagai string daripada menambahkannya sebagai angka.
sumber
b
kolomSatu poin kecil untuk solusi Andy Hayden - itu tidak berfungsi (lagi?) Karena
np.nan == np.nan
menghasilkanFalse
, sehinggareplace
fungsi tersebut tidak benar-benar melakukan apa-apa.Apa yang berhasil bagi saya adalah ini:
(Setidaknya itulah perilaku Pandas 0.19.2. Maaf untuk menambahkannya sebagai jawaban yang berbeda, saya tidak memiliki reputasi yang cukup untuk berkomentar.)
sumber
df['b'].fillna(-1)
.Semua jawaban yang diberikan sejauh ini menghasilkan perilaku yang berpotensi berbahaya karena sangat mungkin Anda memilih nilai dummy yang sebenarnya merupakan bagian dari dataset. Ini semakin mungkin karena Anda membuat grup dengan banyak atribut. Sederhananya, pendekatan itu tidak selalu digeneralisasi dengan baik.
Pemecahan yang kurang rumit adalah dengan menggunakan pd.drop_duplicates () untuk membuat indeks kombinasi nilai yang unik, masing-masing dengan ID mereka sendiri, dan kemudian mengelompokkan pada id itu. Itu lebih verbose tetapi menyelesaikan pekerjaan:
Perhatikan bahwa Anda sekarang dapat melakukan hal berikut:
Ini akan mengembalikan hasil yang sukses tanpa harus khawatir menimpa data nyata yang keliru sebagai nilai dummy.
sumber
Saya sudah menjawab ini, tetapi beberapa alasan jawabannya diubah menjadi komentar. Namun demikian, ini adalah solusi paling efisien:
Tidak bisa memasukkan (dan menyebarkan) NaN dalam kelompok cukup menjengkelkan. Mengutip R tidak meyakinkan, karena perilaku ini tidak konsisten dengan banyak hal lain. Bagaimanapun, hack dummy juga sangat buruk. Namun, ukuran (termasuk NaNs) dan jumlah (mengabaikan NaNs) grup akan berbeda jika ada NaNs.
Ketika ini berbeda, Anda dapat mengatur nilai kembali ke Tidak ada untuk hasil fungsi agregasi untuk grup itu.
sumber
Dipasang Pandas 1.1 di Anaconda
Saya tidak dapat mengomentari jawaban cs95 tetapi dia membantu saya untuk menyelesaikan masalah.
Saya mencoba menginstal Pandas 1.1 tetapi gagal menggunakan kodenya, jadi saya googled dan dapat menginstal.
Saya pertama kali menjalankan anaconda prompt sebagai administrator dan menempelkan kode berikut:
pip install pandas==1.1.0rc0
Setelah itu termasuk penggunaan
dropna = False
Tautan: https://libraries.io/pypi/panda
sumber
df = df.fillna("")
ini bekerja untuk sayasumber