2012-01-18 26 views
29

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

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

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

लेकिन क्या होगा अगर मैं चाहता था की तरह एक फिल्टर 10 से अधिक?

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

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

उत्तर

36

मैं आपको इन प्रश्नों को mailing list पर पेश करने के लिए प्रोत्साहित करता हूं, लेकिन किसी भी मामले में, यह अभी भी अंतर्निहित न्यूमपी सरणी के साथ काम कर रहा है। उदाहरण के लिए, इस उदाहरण में पंक्तियों जहां किसी भी स्तंभ में मूल्य से अधिक, का चयन करने के कहते हैं, 1.5:

In [11]: df 
Out[11]: 
      A  B  C  D  
2000-01-03 -0.59885 -0.18141 -0.68828 -0.77572 
2000-01-04 0.83935 0.15993 0.95911 -1.12959 
2000-01-05 2.80215 -0.10858 -1.62114 -0.20170 
2000-01-06 0.71670 -0.26707 1.36029 1.74254 
2000-01-07 -0.45749 0.22750 0.46291 -0.58431 
2000-01-10 -0.78702 0.44006 -0.36881 -0.13884 
2000-01-11 0.79577 -0.09198 0.14119 0.02668 
2000-01-12 -0.32297 0.62332 1.93595 0.78024 
2000-01-13 1.74683 -1.57738 -0.02134 0.11596 
2000-01-14 -0.55613 0.92145 -0.22832 1.56631 
2000-01-17 -0.55233 -0.28859 -1.18190 -0.80723 
2000-01-18 0.73274 0.24387 0.88146 -0.94490 
2000-01-19 0.56644 -0.49321 1.17584 -0.17585 
2000-01-20 1.56441 0.62331 -0.26904 0.11952 
2000-01-21 0.61834 0.17463 -1.62439 0.99103 
2000-01-24 0.86378 -0.68111 -0.15788 -0.16670 
2000-01-25 -1.12230 -0.16128 1.20401 1.08945 
2000-01-26 -0.63115 0.76077 -0.92795 -2.17118 
2000-01-27 1.37620 -1.10618 -0.37411 0.73780 
2000-01-28 -1.40276 1.98372 1.47096 -1.38043 
2000-01-31 0.54769 0.44100 -0.52775 0.84497 
2000-02-01 0.12443 0.32880 -0.71361 1.31778 
2000-02-02 -0.28986 -0.63931 0.88333 -2.58943 
2000-02-03 0.54408 1.17928 -0.26795 -0.51681 
2000-02-04 -0.07068 -1.29168 -0.59877 -1.45639 
2000-02-07 -0.65483 -0.29584 -0.02722 0.31270 
2000-02-08 -0.18529 -0.18701 -0.59132 -1.15239 
2000-02-09 -2.28496 0.36352 1.11596 0.02293 
2000-02-10 0.51054 0.97249 1.74501 0.20525 
2000-02-11 0.10100 0.27722 0.65843 1.73591 

In [12]: df[(df.values > 1.5).any(1)] 
Out[12]: 
      A  B  C  D  
2000-01-05 2.8021 -0.1086 -1.62114 -0.2017 
2000-01-06 0.7167 -0.2671 1.36029 1.7425 
2000-01-12 -0.3230 0.6233 1.93595 0.7802 
2000-01-13 1.7468 -1.5774 -0.02134 0.1160 
2000-01-14 -0.5561 0.9215 -0.22832 1.5663 
2000-01-20 1.5644 0.6233 -0.26904 0.1195 
2000-01-28 -1.4028 1.9837 1.47096 -1.3804 
2000-02-10 0.5105 0.9725 1.74501 0.2052 
2000-02-11 0.1010 0.2772 0.65843 1.7359 

एकाधिक शर्तों & या | का उपयोग कर जोड़ा जा करने के लिए है (और कोष्ठक!):

In [13]: df[(df['A'] > 1) | (df['B'] < -1)] 
Out[13]: 
      A  B  C  D  
2000-01-05 2.80215 -0.1086 -1.62114 -0.2017 
2000-01-13 1.74683 -1.5774 -0.02134 0.1160 
2000-01-20 1.56441 0.6233 -0.26904 0.1195 
2000-01-27 1.37620 -1.1062 -0.37411 0.7378 
2000-02-04 -0.07068 -1.2917 -0.59877 -1.4564 

मुझे इस प्रकार की चीजों को आसान बनाने के लिए किसी प्रकार की क्वेरी एपीआई होने में बहुत दिलचस्पी होगी

+1

फिर से धन्यवाद। मेलिंग सूची पर भविष्य के प्रश्न पोस्ट करें। लेकिन अभी के लिए, अगर आप प्रोग्रामेटिक रूप से ऐसा करना चाहते हैं तो क्या होगा? आपके पास कॉलम लेबल की एक सूची थी ... आप इसे '|' में कैसे प्राप्त कर सकते हैं अंकन? जैसे यदि 'लेबल = ['ए', 'बी', 'सी', ... ']' – user248237dfsf

+0

स्पष्टीकरण के लिए:' कोई भी (1) 'दृष्टिकोण काम नहीं करेगा यदि आपके पास तालिका में अन्य मूल्य थे जो आपने नहीं किया था फ़िल्टर करना नहीं चाहता। मान लीजिए कि कई कॉलम हैं और आप केवल 'किसी भी' को उनके सबसेट पर लागू करना चाहते हैं (आप सबसेट के लेबल जानते हैं)। – user248237dfsf

5

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

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

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

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

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

print pandas_select(df, select_dict).to_string() 

आप वाक्य रचना भी आगे या तो इमारत से अधिक बहस में pandas_select करने के लिए छोटा कर सकते हैं:

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] 

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

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

+0

यदि मेरे पास एक सूची है ['ऐलिस', 'बॉब', 'कार्ल'] मैं उन वस्तुओं का चयन करने के लिए शब्दकोश कैसे उत्पन्न कर सकता हूं जहां डेटाफ्रेम ['ए'] मेरी सूची में है? –

+1

यदि सूची 'ए = [' ऐलिस ',' बॉब ',' कार्ल '] है और समग्र डेटा फ्रेम को' डीएफ' कहा जाता है, तो आप यह कर सकते हैं: 'df [df.A.isin (ए) ] 'और यह पंक्ति सूचकांक का उप-चयन करेगा जहां सेट सदस्यता स्थिति स्तंभ' ए' के तत्वों के लिए सत्य है। सरल वाक्यविन्यास के साथ यह विकल्प रखने के लिए लॉजिकल व्यक्त करने के लिए ऊपर बनाई गई मिनी डोमेन-विशिष्ट भाषा का विस्तार करना शायद एक असहज कोर होगा। – ely

+0

शायद आगामी (पांडा 0.13) क्वेरी विधि भी देखें: http://pandas.pydata.org/pandas-docs/dev/indexing.html?highlight=query#the-query-method-experimental और http : //stackoverflow.com/questions/18521037/pandas-iterative-filtering-a-dataframes-rows – RuiDC

1

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

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

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

क्वेरी सिंटैक्स के रूप में इस प्रकार आप एक का चयन करें बयान में एक "कहां" खंड की तरह एकाधिक फिल्टर का उपयोग करने के लिए अनुमति देगा।

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

अतिरिक्त विवरण के लिए Pandas documentation देखें।

संबंधित मुद्दे