python - पाइथन पांडा के साथ कई कॉलम में चयन?



csv numpy (2)

इस सवाल से पूछा गया और उत्तर दिया गया क्योंकि पांडस में एक प्रश्न सुविधा जोड़ा गया है। एक उदाहरण नीचे दिया गया है।

इस नमूना डेटा फ्रेम को देखते हुए:

periods = 8
dates = pd.date_range('20170101', periods=periods)
rand_df = pd.DataFrame(np.random.randn(periods,4), index=dates, 
      columns=list('ABCD'))

निम्नानुसार क्वेरी सिंटैक्स आपको एक से अधिक फ़िल्टर का उपयोग करने की अनुमति देगा, जैसे कि एक चयन कथन में "WHERE" खंड।

rand_df.query("A < 0 or B < 0")

अतिरिक्त विवरण के लिए पांडा दस्तावेज देखें।

मेरे पास पांडा में pandas.read_table जो एक csv फ़ाइल से pandas.read_table का उपयोग करके बनाया गया था। डेटाफ्रेम में कई कॉलम होते हैं और इसे कॉलम में से एक द्वारा अनुक्रमित किया जाता है (जो अद्वितीय है, जिसमें प्रत्येक पंक्ति के अनुक्रमण के लिए उपयोग किए गए कॉलम के लिए एक अद्वितीय मान होता है।)

मैं एकाधिक कॉलम पर लागू "जटिल" फ़िल्टर के आधार पर अपने डेटाफ्रेम की पंक्तियों का चयन कैसे कर सकता हूं? मैं colA के टुकड़े को आसानी से चुन सकता हूं जहां कॉलम colA 10 से अधिक है उदाहरण के लिए:

df_greater_than10 = df[df["colA"] > 10]

लेकिन क्या होगा यदि मैं एक फ़िल्टर चाहता था: df का टुकड़ा चुनें जहां कोई भी कॉलम 10 से अधिक हो?

या जहां colA लिए मूल्य 10 से अधिक है लेकिन colB का मूल्य 5 से कम है?

इन्हें पांडा में कैसे लागू किया जाता है? धन्यवाद।


पांडस में इसके लिए सिंटैक्स को कम करने के लिए कम से कम कुछ दृष्टिकोण हैं, जब तक कि यह सड़क के नीचे एक पूर्ण क्वेरी एपीआई न हो (शायद मैं जिथब परियोजना में शामिल होने की कोशिश करूंगा और ऐसा करने के लिए समय परमिट है और यदि किसी और के पास पहले से कोई नहीं है शुरू कर दिया है)।

सिंटैक्स को छोटा करने के लिए एक विधि नीचे दी गई है:

inds = df.apply(lambda x: x["A"]>10 and x["B"]<5, axis=1) 
print df[inds].to_string()

इसे पूरी तरह से हल करने के लिए, किसी को एसक्यूएल चयन और पांडा में क्लॉज की तरह कुछ बनाने की आवश्यकता होगी। यह बिल्कुल छोटा नहीं है, लेकिन एक स्टैब जो मुझे लगता है कि इसके लिए काम कर सकता है वह पाइथन operator अंतर्निहित मॉड्यूल का उपयोग करना है। यह आपको प्रतीकों की बजाय कार्यों की तुलना में अधिक से अधिक चीजों का इलाज करने की अनुमति देता है। तो आप निम्न कार्य कर सकते हैं:

def pandas_select(dataframe, select_dict):

    inds = dataframe.apply(lambda x: reduce(lambda v1,v2: v1 and v2, 
                           [elem[0](x[key], elem[1]) 
                           for key,elem in select_dict.iteritems()]), axis=1)
    return dataframe[inds]

फिर आपके जैसे एक परीक्षण उदाहरण निम्नलिखित करना होगा:

import operator
select_dict = {
               "A":(operator.gt,10),
               "B":(operator.lt,5)                  
              }

print pandas_select(df, select_dict).to_string()

आप अलग-अलग सामान्य लॉजिकल ऑपरेटरों को स्वचालित रूप से संभालने के लिए, या छोटे नामों के साथ नामस्थान में आयात करके, pandas_select पर अधिक तर्कों में निर्माण करके वाक्यविन्यास को और भी कम कर सकते हैं।

ध्यान दें कि उपरोक्त pandas_select फ़ंक्शन केवल तार्किक-और बाधाओं की श्रृंखला के साथ काम करता है। आपको विभिन्न तार्किक व्यवहार प्राप्त करने के लिए इसे संशोधित करना होगा। या not और DeMorgan के कानून का उपयोग करें।





pandas