Kebanyakan operasi di pandas
dapat dicapai dengan operator chaining ( groupby
, aggregate
, apply
, dll), tetapi satu-satunya cara saya telah menemukan untuk baris filter melalui braket pengindeksan yang normal
df_filtered = df[df['column'] == value]
Ini tidak menarik karena mengharuskan saya menugaskan df
ke variabel sebelum dapat menyaring nilai-nilainya. Apakah ada yang lebih seperti yang berikut ini?
df_filtered = df.mask(lambda x: x['column'] == value)
df.query
danpd.eval
sepertinya cocok untuk kasus penggunaan ini. Untuk informasi tentang rangkaianpd.eval()
fungsi, fitur dan kasingnya , silakan kunjungi Evaluasi Ekspresi Dinamis di panda menggunakan pd.eval () .Jawaban:
Saya tidak sepenuhnya yakin apa yang Anda inginkan, dan baris kode terakhir Anda juga tidak membantu, tetapi:
Penyaringan "dirantai" dilakukan dengan "merantai" kriteria dalam indeks boolean.
Jika Anda ingin metode berantai, Anda dapat menambahkan metode topeng Anda sendiri dan menggunakannya.
sumber
(df.A == 1) & (df.D == 6)
, apakah "&" operator kelebihan beban di Pandas?pandas.
. Kamu harusimport pandas as pd
.import pandas as pd
sudah biasa dilakukan sekarang. Saya ragu ketika saya menjawab pertanyaan itu.Filter dapat dirantai menggunakan kueri Pandas :
Filter juga dapat digabungkan dalam satu permintaan:
sumber
df.query('a in list([1,2])')
,s = set([1,2]); df.query('a in @s')
.Jawaban dari @lodagro sangat bagus. Saya akan memperluasnya dengan menggeneralisasi fungsi mask sebagai:
Maka Anda dapat melakukan hal-hal seperti:
sumber
DataFrame
s!Sejak versi 0.18.1 yang
.loc
metode menerima callable untuk seleksi. Bersama dengan fungsi lambda Anda dapat membuat filter rantai yang sangat fleksibel:Jika semua yang Anda lakukan adalah memfilter, Anda juga dapat menghilangkan
.loc
.sumber
Saya menawarkan ini untuk contoh tambahan. Ini adalah jawaban yang sama dengan https://stackoverflow.com/a/28159296/
Saya akan menambahkan suntingan lain untuk menjadikan tulisan ini lebih bermanfaat.
pandas.DataFrame.query
query
dibuat untuk tujuan ini. Pertimbangkan kerangka datadf
Mari kita gunakan
query
untuk memfilter semua baris di manaD > B
Yang kami rantai
sumber
Saya memiliki pertanyaan yang sama kecuali bahwa saya ingin menggabungkan kriteria menjadi kondisi ATAU. Format yang diberikan oleh Wouter Overmeire menggabungkan kriteria ke dalam kondisi AND sehingga keduanya harus dipenuhi:
Tetapi saya menemukan bahwa, jika Anda membungkus setiap kondisi
(... == True)
dan bergabung dengan kriteria dengan pipa, kriteria tersebut digabungkan dalam kondisi OR, terpuaskan setiap kali salah satu dari itu benar:sumber
df[(df.A==1) | (df.D==6)]
cukup untuk apa yang ingin Anda capai?panda memberikan dua alternatif jawaban Wouter Overmeire yang tidak memerlukan penggantian. Satu
.loc[.]
dengan callable, seperti padayang lainnya adalah
.pipe()
, seperti dalamsumber
Jawaban saya mirip dengan yang lain. Jika Anda tidak ingin membuat fungsi baru, Anda dapat menggunakan apa yang telah ditetapkan panda untuk Anda. Gunakan metode pipa.
sumber
a.join(b).pipe(lambda df: df[df.column_to_filter == 'VALUE'])
Jika Anda ingin menerapkan semua topeng boolean umum serta topeng tujuan umum, Anda dapat membuang yang berikut dalam file dan kemudian menetapkan semuanya sebagai berikut:
Pemakaian:
Agak sedikit macet tetapi bisa membuat hal-hal sedikit lebih bersih jika Anda terus-menerus memotong dan mengubah kumpulan data sesuai dengan filter. Ada juga filter tujuan umum yang diadaptasi dari Daniel Velkov di atas dalam fungsi gen_mask yang dapat Anda gunakan dengan fungsi lambda atau sebaliknya jika diinginkan.
File yang akan disimpan (saya menggunakan masks.py):
sumber
Solusi ini lebih bersifat meretas dalam hal implementasi, tetapi saya merasa jauh lebih bersih dalam hal penggunaan, dan tentu saja lebih umum daripada yang lain yang diusulkan.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
Anda tidak perlu mengunduh seluruh repo: menyimpan file dan melakukan
harus cukup. Maka Anda menggunakannya seperti ini:
Contoh penggunaan yang sedikit kurang bodoh:
Omong-omong: bahkan dalam kasus di mana Anda hanya menggunakan boolean cols,
dapat jauh lebih efisien daripada
karena mengevaluasi
cond2
hanya manacond1
adalahTrue
.DISCLAIMER: Saya pertama kali memberikan jawaban ini di tempat lain karena saya belum melihat ini.
sumber
Hanya ingin menambahkan demonstrasi menggunakan
loc
untuk menyaring tidak hanya oleh baris tetapi juga oleh kolom dan beberapa manfaat untuk operasi berantai.Kode di bawah ini dapat memfilter baris berdasarkan nilai.
Dengan memodifikasinya sedikit, Anda dapat memfilter kolom juga.
Jadi mengapa kita menginginkan metode yang dirantai? Jawabannya adalah mudah dibaca jika Anda memiliki banyak operasi. Sebagai contoh,
sumber
tampaknya berfungsi: Anda dapat membuat sarang
[]
operator juga. Mungkin mereka menambahkannya sejak Anda mengajukan pertanyaan.sumber
df
sekarang tidak perlu merujuk output dari bagian rantai sebelumnya.Jika Anda mengatur kolom Anda untuk mencari sebagai indeks, maka Anda dapat menggunakan
DataFrame.xs()
untuk mengambil bagian silang. Ini tidak serbaguna sepertiquery
jawabannya, tetapi mungkin berguna dalam beberapa situasi.sumber
Anda juga dapat memanfaatkan perpustakaan numpy untuk operasi logis. Cukup cepat.
sumber