मेरे पास एक परिदृश्य है जहां एक उपयोगकर्ता पंडों डेटाफ़्रेम या श्रृंखला ऑब्जेक्ट के लिए कई फ़िल्टर लागू करना चाहता है। अनिवार्य रूप से, मैं कुशलतापूर्वक फ़िल्टरिंग (तुलना संचालन) का एक गुच्छा चेन करना चाहता हूं जो उपयोगकर्ता द्वारा रन-टाइम पर निर्दिष्ट किए गए हों।
फिल्टर एडिटिव (उर्फ प्रत्येक को लागू किया जाना चाहिए संकीर्ण परिणाम) होना चाहिए।
मैं वर्तमान में उपयोग कर रहा हूं reindex()
लेकिन यह हर बार एक नई वस्तु बनाता है और अंतर्निहित डेटा की प्रतिलिपि बनाता है (यदि मैं प्रलेखन को सही ढंग से समझता हूं)। इसलिए, किसी बड़ी श्रृंखला या डेटाफ़्रेम को फ़िल्टर करते समय यह वास्तव में अक्षम हो सकता है।
मैं सोच रहा हूँ कि का उपयोग करते हुए apply()
, map()
, या ऐसा ही कुछ बेहतर हो सकता है। मैं पंडों के लिए बहुत नया हूं, हालांकि अभी भी मेरे सिर को हर चीज के चारों ओर लपेटने की कोशिश कर रहा हूं।
टी एल; डॉ
मैं निम्नलिखित फॉर्म का शब्दकोश लेना चाहता हूं और दिए गए सीरीज ऑब्जेक्ट में प्रत्येक ऑपरेशन को लागू करता हूं और एक 'फिल्टर्ड' सीरीज ऑब्जेक्ट को वापस करता हूं।
relops = {'>=': [1], '<=': [1]}
लंबा उदाहरण
मैं इस बात का उदाहरण देता हूं कि मेरे पास वर्तमान में क्या है और केवल एक ही श्रृंखला ऑब्जेक्ट को फ़िल्टर कर रहा हूं। नीचे वह फ़ंक्शन है जिसका मैं वर्तमान में उपयोग कर रहा हूं:
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
उपयोगकर्ता उन कार्यों के साथ एक शब्दकोश प्रदान करता है जिसे वे करना चाहते हैं:
>>> 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
फिर, मेरे उपरोक्त दृष्टिकोण के साथ 'समस्या' यह है कि मुझे लगता है कि इन-द-स्टेप के लिए डेटा की अनावश्यक रूप से बहुत अधिक नकल है।
इसके अलावा, मैं इसका विस्तार करना चाहूंगा ताकि पारित किए गए शब्दकोश में कॉलम को ऑपरेटर में शामिल किया जा सके और इनपुट शब्दकोश के आधार पर संपूर्ण DataFrame को फ़िल्टर किया जा सके। हालाँकि, मैं यह मान रहा हूं कि श्रृंखला के लिए जो भी काम करता है उसे आसानी से एक DataFrame तक विस्तारित किया जा सकता है।
df.query
और pd.eval
अपने उपयोग के मामले के लिए अच्छे फिट की तरह लग रहे हैं। pd.eval()
फ़ंक्शंस के परिवार, उनकी विशेषताओं और उपयोग के मामलों की जानकारी के लिए, कृपया pd.eval () का उपयोग करके पांडा में डायनेमिक एक्सप्रेशन मूल्यांकन का दौरा करें ।