Mengalami masalah saat memfilter dataframe hasil saya dengan suatu or
syarat. Saya ingin hasil saya df
mengekstraksi semua var
nilai kolom yang di atas 0,25 dan di bawah -0,25.
Logika di bawah ini memberi saya nilai kebenaran yang ambigu namun bekerja ketika saya membagi penyaringan ini dalam dua operasi terpisah. Apa yang terjadi disini? tidak yakin di mana harus menggunakan yang disarankan a.empty(), a.bool(), a.item(),a.any() or a.all()
.
result = result[(result['var']>0.25) or (result['var']<-0.25)]
|
sebagai gantior
abs(result['var'])>0.25
Jawaban:
Pernyataan
or
danand
python membutuhkantruth
nilai-. Untukpandas
ini dianggap ambigu sehingga Anda harus menggunakan operasi "bitwise"|
(atau) atau&
(dan):Ini kelebihan beban untuk jenis struktur data untuk menghasilkan elemen-bijaksana
or
(atauand
).Hanya dengan menambahkan beberapa penjelasan pada pernyataan ini:
Pengecualian dibuang ketika Anda ingin mendapatkan
bool
daripandas.Series
:Apa yang Anda tekan adalah tempat di mana operator secara implisit mengubah operan ke
bool
(Anda menggunakanor
tetapi juga terjadi untukand
,if
danwhile
):Selain 4 pernyataan ini ada beberapa fungsi python yang menyembunyikan beberapa
bool
panggilan (sepertiany
,all
,filter
, ...) ini biasanya tidak bermasalah denganpandas.Series
tapi untuk kelengkapan saya ingin menyebutkan ini.Dalam kasus Anda, pengecualian tidak terlalu membantu, karena tidak menyebutkan alternatif yang tepat . Untuk
and
danor
Anda dapat menggunakan (jika Anda ingin perbandingan elemen-bijaksana):numpy.logical_or
:atau hanya
|
operator:numpy.logical_and
:atau hanya
&
operator:Jika Anda menggunakan operator maka pastikan Anda mengatur tanda kurung dengan benar karena prioritas operator .
Ada beberapa fungsi numpy logis yang harus dikerjakan
pandas.Series
.Alternatif yang disebutkan dalam Pengecualian lebih cocok jika Anda menemukannya saat melakukan
if
atauwhile
. Saya akan segera menjelaskan masing-masing:Jika Anda ingin memeriksa apakah Seri Anda kosong :
Python biasanya menafsirkan
len
gth kontainer (sepertilist
,tuple
, ...) sebagai kebenaran-nilai jika tidak memiliki interpretasi boolean eksplisit. Jadi jika Anda ingin cek seperti python, Anda bisa melakukan:if x.size
atauif not x.empty
bukannyaif x
.Jika Anda
Series
mengandung satu dan hanya satu nilai boolean:Jika Anda ingin memeriksa item pertama dan satu-satunya dari Seri Anda (suka
.bool()
tetapi berfungsi bahkan untuk konten yang tidak boolean):Jika Anda ingin memeriksa apakah semua atau semua item tidak-nol, tidak-kosong atau tidak-Salah:
sumber
and
,or
dannot
Python. Operator ini secara langsung menggunakan apabool
yang dikembalikan operan. Dan dengan cara Pandas / NumPy kelebihan yang sudah menaikkanValueError
karena mereka menganggap nilai kebenaran dari struktur data seperti itu ambigu.Untuk logika boolean, gunakan
&
dan|
.Untuk melihat apa yang terjadi, Anda mendapatkan kolom boolean untuk setiap perbandingan, misalnya
Ketika Anda memiliki beberapa kriteria, Anda akan mendapatkan beberapa kolom kembali. Inilah sebabnya mengapa logika join bersifat ambigu. Menggunakan
and
atauor
memperlakukan setiap kolom secara terpisah, jadi pertama-tama Anda harus mengurangi kolom itu menjadi nilai boolean tunggal. Misalnya, untuk melihat apakah ada nilai atau semua nilai di setiap kolom Benar.Salah satu cara berbelit-belit untuk mencapai hal yang sama adalah dengan zip semua kolom ini bersama-sama, dan melakukan logika yang sesuai.
Untuk detail lebih lanjut, lihat Pengindeksan Boolean dalam dokumen.
sumber
Nah panda menggunakan bitwise '&' '|' dan setiap kondisi harus dibungkus dalam '()'
Misalnya karya berikut
Tetapi kueri yang sama tanpa tanda kurung tidak
sumber
Atau, sebagai alternatif, Anda dapat menggunakan modul Operator. Informasi lebih rinci ada di sini Python docs
sumber
Jawaban yang luar biasa ini menjelaskan dengan sangat baik apa yang sedang terjadi dan memberikan solusi. Saya ingin menambahkan solusi lain yang mungkin cocok dalam kasus serupa: menggunakan
query
metode:Lihat juga http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-query .
(Beberapa tes dengan kerangka data yang saat ini saya kerjakan menunjukkan bahwa metode ini sedikit lebih lambat daripada menggunakan operator bitwise pada serangkaian boolean: 2 ms vs 870 µs)
Sepotong peringatan : Setidaknya satu situasi di mana ini tidak langsung adalah ketika nama kolom kebetulan menjadi ekspresi python. Aku punya kolom bernama
WT_38hph_IP_2
,WT_38hph_input_2
danlog2(WT_38hph_IP_2/WT_38hph_input_2)
dan ingin melakukan query berikut:"(log2(WT_38hph_IP_2/WT_38hph_input_2) > 1) and (WT_38hph_IP_2 > 20)"
Saya memperoleh kaskade pengecualian berikut:
KeyError: 'log2'
UndefinedVariableError: name 'log2' is not defined
ValueError: "log2" is not a supported function
Saya kira ini terjadi karena parser kueri mencoba membuat sesuatu dari dua kolom pertama alih-alih mengidentifikasi ekspresi dengan nama kolom ketiga.
Solusi yang mungkin diusulkan di sini .
sumber
Saya mengalami kesalahan yang sama dan macet dengan pyspark dataframe selama beberapa hari, saya berhasil menyelesaikannya dengan mengisi nilai-nilai na dengan 0 karena saya membandingkan nilai integer dari 2 bidang.
sumber