Asumsikan saya memiliki panda DataFrame dengan dua kolom, A dan B. Saya ingin memodifikasi DataFrame ini (atau membuat salinan) sehingga B selalu NaN setiap kali A adalah 0. Bagaimana saya mencapainya?
Saya mencoba yang berikut ini
df['A'==0]['B'] = np.nan
dan
df['A'==0]['B'].values.fill(np.nan)
tanpa keberhasilan.
where
seperti yang terlihat dalam solusi di bawah iniJawaban:
Gunakan
.loc
untuk pengindeksan berbasis label:The
df.A==0
ekspresi menciptakan serangkaian boolean yang indeks baris,'B'
memilih kolom. Anda juga dapat menggunakan ini untuk mengubah subset kolom, misalnya:Saya tidak cukup tahu tentang internal panda untuk tahu persis mengapa itu bekerja, tetapi masalah dasarnya adalah bahwa kadang-kadang indeks ke DataFrame mengembalikan salinan hasil, dan kadang-kadang mengembalikan pandangan pada objek asli. Menurut dokumentasi di sini , perilaku ini tergantung pada perilaku numpy yang mendasarinya. Saya menemukan bahwa mengakses segala sesuatu dalam satu operasi (bukan [satu] [dua]) lebih mungkin berfungsi untuk pengaturan.
sumber
Berikut ini dari panda docs pada pengindeksan lanjutan:
Bagian ini akan menjelaskan dengan tepat apa yang Anda butuhkan! Ternyata
df.loc
(seperti .ix telah ditinggalkan - seperti yang telah ditunjukkan banyak orang di bawah ini) dapat digunakan untuk mengiris / mending bingkai data. Dan. Dapat juga digunakan untuk mengatur sesuatu.Jadi jawaban Bren mengatakan 'temukan aku semua tempat di mana
df.A == 0
, pilih kolomB
dan atur kenp.nan
'sumber
loc[selection criteria, columns I want]
tetap melekat di benak Anda ...Mulai dari panda 0,20 ix sudah usang . Cara yang benar adalah dengan menggunakan df.loc
di sini adalah contoh kerja
Penjelasan:
Seperti yang dijelaskan dalam dokumen di sini , pada
.loc
dasarnya berbasis label, tetapi juga dapat digunakan dengan array boolean .Jadi, apa yang kami lakukan di atas berlaku
df.loc[row_index, column_index]
dengan:loc
dapat menggunakan array boolean sebagai topeng yang memberi tahu panda bagian dari baris yang ingin kita ubahrow_index
loc
juga berdasarkan label untuk memilih kolom menggunakan label'B'
dicolumn_index
Kita dapat menggunakan logika, kondisi atau operasi apa pun yang mengembalikan serangkaian boolean untuk membangun array boolean. Dalam contoh di atas, kami ingin semua
rows
yang mengandung a0
, untuk itu kami dapat menggunakandf.A == 0
, seperti yang Anda lihat dalam contoh di bawah ini, ini mengembalikan serangkaian boolean.Kemudian, kami menggunakan array boolean di atas untuk memilih dan mengubah baris yang diperlukan:
Untuk informasi lebih lanjut, periksa dokumentasi pengindeksan lanjutan di sini .
sumber
Untuk peningkatan kecepatan besar, gunakan fungsi NumPy where.
Mempersiapkan
Buat DataFrame dua kolom dengan 100.000 baris dengan beberapa nol.
Solusi cepat dengan
numpy.where
Pengaturan waktu
Numpy
where
sekitar 4x lebih cepatsumber
.values
dinp.where(df.a.values == 0, np.nan, df.b.values)
? Sepertinyanp.where(df.a == 0, np.nan, df.b)
juga berfungsi?Untuk mengganti kolom multipel, ubah ke array numpy menggunakan
.values
:sumber