2010-09-27 1 views
17

में डेटा सब्सक्राइब करना मैं कुछ पायथन कोड के लिए आर में सबसेट कमांड के समतुल्य का उपयोग करना चाहता हूं।पायथन

col1 col2 col3 col4 col5 
100002 2006 1.1 0.01 6352 
100002 2006 1.2 0.84 304518 
100002 2006 2 1.52 148219 
100002 2007 1.1 0.01 6292 
10002 2006 1.1 0.01 5968 
10002 2006 1.2 0.25 104318 
10002 2007 1.1 0.01 6800 
10002 2007 4 2.03 25446 
10002 2008 1.1 0.01 6408 

मैं col1 और col2 की सामग्री पर आधारित डेटा सबसेट को चाहते हैं:

यहाँ मेरी डाटा नहीं है। (Col1 में अद्वितीय मान 100002 और 10002 हैं, और col2 में 2006,2007 और 2008 हैं।)

यह सबसेट कमांड का उपयोग करके आर में किया जा सकता है, क्या Python में कुछ भी समान है?

उत्तर

20

जबकि इटरेटर आधारित जवाब, बिल्कुल ठीक हैं अगर आप NumPy सरणी के साथ काम कर रहे हैं (जैसा कि आप का उल्लेख है कि आप कर रहे हैं) वहाँ का चयन चीजों में से बेहतर और तेज रास्ते हैं:

import numpy as np 
data = np.array([ 
     [100002, 2006, 1.1, 0.01, 6352], 
     [100002, 2006, 1.2, 0.84, 304518], 
     [100002, 2006, 2, 1.52, 148219], 
     [100002, 2007, 1.1, 0.01, 6292], 
     [10002, 2006, 1.1, 0.01, 5968], 
     [10002, 2006, 1.2, 0.25, 104318], 
     [10002, 2007, 1.1, 0.01, 6800], 
     [10002, 2007, 4, 2.03, 25446], 
     [10002, 2008, 1.1, 0.01, 6408] ]) 

subset1 = data[data[:,0] == 100002] 
subset2 = data[data[:,0] == 10002] 

यह पैदावार

subset1:

array([[ 1.00002e+05, 2.006e+03, 1.10e+00, 1.00e-02, 6.352e+03], 
     [ 1.00002e+05, 2.006e+03, 1.20e+00, 8.40e-01, 3.04518e+05], 
     [ 1.00002e+05, 2.006e+03, 2.00e+00, 1.52e+00, 1.48219e+05], 
     [ 1.00002e+05, 2.007e+03, 1.10e+00, 1.00e-02, 6.292e+03]]) 

subset2:

array([[ 1.0002e+04, 2.006e+03, 1.10e+00, 1.00e-02, 5.968e+03], 
     [ 1.0002e+04, 2.006e+03, 1.20e+00, 2.50e-01, 1.04318e+05], 
     [ 1.0002e+04, 2.007e+03, 1.10e+00, 1.00e-02, 6.800e+03], 
     [ 1.0002e+04, 2.007e+03, 4.00e+00, 2.03e+00, 2.5446e+04], 
     [ 1.0002e+04, 2.008e+03, 1.10e+00, 1.00e-02, 6.408e+03]]) 

यदि आप पहले कॉलम में अद्वितीय मानों को पहले से नहीं जानते थे, तो आप उन्हें खोजने के लिए numpy.unique1d या बिल्टिन फ़ंक्शन set का उपयोग कर सकते हैं।

संपादित करें: मैं सिर्फ महसूस किया कि आप कुछ इस तरह कर सकते हैं जहां दो कॉलम की अद्वितीय संयोजन है ... उस मामले में डेटा का चयन करना चाहता था:

col1 = data[:,0] 
col2 = data[:,1] 

subsets = {} 
for val1, val2 in itertools.product(np.unique(col1), np.unique(col2)): 
    subset = data[(col1 == val1) & (col2 == val2)] 
    if np.any(subset): 
     subsets[(val1, val2)] = subset 

(मैं भंडारण कर रहा हूँ कुंजी के रूप में सबसेट, कुंजी संयोजन के एक tuple के साथ ... निश्चित रूप से अन्य (और बेहतर है, आप क्या कर रहे हैं के आधार पर) यह करने के तरीके!)

+0

याद रखने के लिए आदेशों की मेरी सूची में फ़िल्टर जोड़ूंगा! पूर्व-निरीक्षण में यह इतना स्पष्ट है कि मुझे इसे स्वयं करना चाहिए था, लेकिन आपकी व्याख्या पूरी हो गई है। हालांकि, क्या आप जानते हैं कि इटरेटर की तुलना में इस दृष्टिकोण का उपयोग करके हम कितनी गति प्राप्त कर सकते हैं?मैंने सोचा कि इटेटर भी बहुत तेज़ हैं! – user308827

+0

@ user308827 - वे हैं, लेकिन यदि आप numpy arrays के साथ काम कर रहे हैं, और सूचियों के साथ काम नहीं कर रहे हैं, तो चीजें करने के numpy तरीके का उपयोग कर तेजी से होगा। आम तौर पर, एक संपूर्ण numpy सरणी के माध्यम से पुनरावृत्ति धीमा है। इटरेटर-आधारित समाधानों को अजगर में प्रत्येक तत्व के माध्यम से फिर से शुरू करना होता है। जब आप एक बूलियन numpy सरणी का उपयोग कर एक numpy सरणी का एक सबसेट का चयन करते हैं, तो संकलन कोड में दृश्यों के पीछे पुनरावृत्ति किया जाता है। (मैं यहां oversimplifying हूँ, लेकिन यह भी है, वैसे भी)। असल में, यदि आप अपने डेटा को रखने के लिए numpy arrays का उपयोग कर रहे हैं, तो यह numpy कार्यों के साथ उन पर काम करने के लिए तेज़ है। –

+0

इसके अलावा, सबसेट में 2 स्थितियों को गठबंधन करने का कोई तरीका है? उदा।, Subset1 = डेटा [(डेटा [:, 0] == 100002) और (डेटा [:, 1] == 2007)] काम नहीं कर रहा है। धन्यवाद! – user308827

2

चूंकि मैं आर से परिचित नहीं हूं और न ही यह सबसेट कमांड आपके विवरण के आधार पर कैसे काम करता है, मैं सुझाव दे सकता हूं कि आप itertool की Groupby कार्यक्षमता पर नज़र डालें। यदि कोई फ़ंक्शन दिया गया है जो किसी मान को आउटपुट करता है, तो आप उस फ़ंक्शन के आउटपुट के आधार पर समूह बना सकते हैं। groupby से लिया गया:

groups = [] 
uniquekeys = [] 
data = sorted(data, key=keyfunc) 
for k, g in groupby(data, keyfunc): 
    groups.append(list(g))  # Store group iterator as a list 
    uniquekeys.append(k) 

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

मुझे लगता है कि आपके मूल्य पंक्ति-दर-पंक्ति आधार पर वापस आ रहे हैं।

+0

धन्यवाद! यह सहायक है। – user308827

5

subset() आर में पाइथन में filter() के बराबर है। संदर्भ नोट के रूप में, इस सूची comprehensions द्वारा परोक्ष किया जाएगा, अगर ऐसा है, उदाहरण के लिए, आपके डेटा पंक्तियों एक iterable में किया गया items बुलाया कोड लिखने की सबसे संक्षिप्त और स्पष्ट रास्ता

[ item for item in items if item.col2 == 2006 ] 

हो सकता है।

+0

धन्यवाद! मैं – user308827