Saya memiliki skenario di mana pengguna ingin menerapkan beberapa filter ke objek DataFrame atau Seri Pandas. Pada dasarnya, saya ingin rantai secara efisien sekelompok penyaringan (operasi perbandingan) bersama-sama yang ditentukan pada saat dijalankan oleh pengguna.
Filter harus aditif (alias masing-masing yang diterapkan harus mempersempit hasil).
Saat ini saya menggunakan reindex()
tetapi ini menciptakan objek baru setiap kali dan menyalin data yang mendasarinya (jika saya memahami dokumentasi dengan benar). Jadi, ini bisa sangat tidak efisien saat memfilter Seri besar atau DataFrame.
Aku berpikir bahwa menggunakan apply()
, map()
atau sesuatu yang serupa mungkin lebih baik. Aku cukup baru untuk panda meskipun masih mencoba untuk membungkus kepalaku di sekitar segalanya.
TL; DR
Saya ingin mengambil kamus dari formulir berikut dan menerapkan setiap operasi ke objek Seri yang diberikan dan mengembalikan objek Seri yang 'difilter'.
relops = {'>=': [1], '<=': [1]}
Contoh Panjang
Saya akan mulai dengan contoh dari apa yang saya miliki saat ini dan hanya memfilter objek Seri tunggal. Di bawah ini adalah fungsi yang saya gunakan saat ini:
def apply_relops(series, relops):
"""
Pass dictionary of relational operators to perform on given series object
"""
for op, vals in relops.iteritems():
op_func = ops[op]
for val in vals:
filtered = op_func(series, val)
series = series.reindex(series[filtered])
return series
Pengguna menyediakan kamus dengan operasi yang ingin mereka lakukan:
>>> df = pandas.DataFrame({'col1': [0, 1, 2], 'col2': [10, 11, 12]})
>>> print df
>>> print df
col1 col2
0 0 10
1 1 11
2 2 12
>>> from operator import le, ge
>>> ops ={'>=': ge, '<=': le}
>>> apply_relops(df['col1'], {'>=': [1]})
col1
1 1
2 2
Name: col1
>>> apply_relops(df['col1'], relops = {'>=': [1], '<=': [1]})
col1
1 1
Name: col1
Sekali lagi, 'masalah' dengan pendekatan saya di atas adalah bahwa saya pikir ada banyak kemungkinan penyalinan data yang tidak perlu untuk langkah-langkah di antaranya.
Juga, saya ingin memperluas ini sehingga kamus yang disahkan dapat menyertakan kolom untuk operator dan memfilter seluruh DataFrame berdasarkan pada kamus input. Namun, saya mengasumsikan apa pun yang berfungsi untuk Seri dapat dengan mudah diperluas ke DataFrame.
df.query
dan pd.eval
sepertinya cocok untuk kasus penggunaan Anda. Untuk informasi tentang rangkaian pd.eval()
fungsi, fitur dan kasingnya , silakan kunjungi Evaluasi Ekspresi Dinamis di panda menggunakan pd.eval () .