2011-10-14 8 views
11

मेरे पास कुछ आर कोड है जो मुझे पोर्ट पर पाइथन की आवश्यकता है। हालांकि, आर का जादू डेटा। फ्रेम और ddply मुझे पायथन में ऐसा करने के लिए एक अच्छा तरीका खोजने से रोक रहे हैं।श्रेणियों के भीतर गणना करें: पायथन में आर के डीडीप्ली के समतुल्य?

नमूना डेटा (आर):

x <- data.frame(d=c(1,1,1,2,2,2),c=c(rep(c('a','b','c'),2)),v=1:6) 

नमूना गणना:

y <- ddply(x, 'd', transform, v2=(v-min(v))/(max(v)-min(v))) 

नमूना उत्पादन:

d c v v2 
1 1 a 1 0.0 
2 1 b 2 0.5 
3 1 c 3 1.0 
4 2 a 4 0.0 
5 2 b 5 0.5 
6 2 c 6 1.0 

तो यहाँ वहाँ बाहर pythonistas के लिए मेरे सवाल है: आप कैसे होगा ऐसा ही करने? आपके पास कुछ महत्वपूर्ण आयामों के साथ डेटा संरचना है।

प्रत्येक (सी), और प्रत्येक (डी) गणना (वी-मिनट (v))/(अधिकतम (v) -min (v)) के लिए) और इसे संबंधित (डी, सी) जोड़ी के साथ संबद्ध करें।

जो भी डेटा संरचनाएं आप चाहते हैं, उनका उपयोग करने के लिए स्वतंत्र महसूस करें, जब तक वे उचित रूप से बड़े डेटासेट (जो स्मृति में फिट होते हैं) पर त्वरित हों।

उत्तर

18

वास्तव में pandas पायथन में इसके लिए सही (और केवल, मेरा विश्वास है) उपकरण है। यह plyr से थोड़ा कम जादुई है, लेकिन यहाँ कैसे GroupBy कार्यक्षमता का उपयोग यह करने के लिए है:

df = DataFrame({'d' : [1.,1.,1.,2.,2.,2.], 
       'c' : np.tile(['a','b','c'], 2), 
       'v' : np.arange(1., 7.)}) 
# in IPython 
In [34]: df 
Out[34]: 
    c d v 
0 a 1 1 
1 b 1 2 
2 c 1 3 
3 a 2 4 
4 b 2 5 
5 c 2 6 

अब एक छोटा सा बदलना समारोह लिखें:

def f(group): 
    v = group['v'] 
    group['v2'] = (v - v.min())/(v.max() - v.min()) 
    return group 

ध्यान दें कि यह भी NAS संभालती है के बाद से v चर रहा है एक पांडा Series वस्तु। d स्तंभ द्वारा

अब समूह और लागू च:

In [36]: df.groupby('d').apply(f) 
Out[36]: 
    c d v v2 
0 a 1 1 0 
1 b 1 2 0.5 
2 c 1 3 1 
3 a 2 4 0 
4 b 2 5 0.5 
5 c 2 6 1 
+0

पूरी तरह से उदाहरण के लिए धन्यवाद। – evanrsparks

4

लगता है जैसे आप pandas और group by or aggregate चाहते हैं।

+0

और एक और अनुमान: उस दूसरे लिंक के पृष्ठ के नीचे 1/4 के बारे में "समूह बदलें" विधि। –

1

तुम भी एक और अधिक प्रदर्शन करता है, तो आप numpy और scipy का उपयोग हासिल कर सकते हैं।

कुछ बदसूरत कोड यह तेजी से हो जाएगा के बावजूद, पांडा तरह से धीमी गति से हो सकता है अगर समूहों की संख्या बहुत बड़ी है और भी बदतर हो सकता है आर से यह हमेशा आर की तुलना में तेजी हो जाएगा:

import numpy as np 
import numpy.lib.recfunctions 
from scipy import ndimage 

x = np.rec.fromarrays(([1,1,1,2,2,2],['a','b','c']*2,range(1, 7)), names='d,c,v') 

unique, groups = np.unique(x['d'], False, True) 
uniques = range(unique.size) 
mins = ndimage.minimum(x['v'], groups, uniques)[groups] 
maxs = ndimage.maximum(x['v'], groups, uniques)[groups] 

x2 = np.lib.recfunctions.append_fields(x, 'v2', (x['v'] - mins)/(maxs - mins + 0.0)) 

#save as csv 
np.savetxt('file.csv', x2, delimiter=';') 
संबंधित मुद्दे