2011-06-22 14 views
14

R'nin son derece yararlı olması için Hadley'in plyr paketini buldum, verileri dönüştürmek için mükemmel bir DSL. Çözme problemi o kadar yaygın ki, diğer kullanım durumlarıyla karşılaşıyorum, R'de veriyi manipüle etmediğimde, fakat diğer programlama dillerinde.Python için Hadley ddply'ın bir uygulaması var mı?

Python için benzer bir şey yapan bir modül olup olmadığını bilen var mı? Uygulamaya çok zor olmamalı, ama zaten var olup olmadığını çok iyi olurdu

def ddply(rows, *cols, op=lambda group_rows: group_rows): 
    """group rows by cols, then apply the function op to each group 
     and return the results aggregating all groups 
     rows is a dict or list of values read by csv.reader or csv.DictReader""" 
    pass 

: gibi bir şey. Bunu uygularım, cols'a göre itertools.groupby kullanıyorum, daha sonra op işlevini uygulayın, daha sonra itertools.chain işlevini kullanarak hepsini zincirleyin. Daha iyi bir çözüm var mı?

cevap

8

Bu ben kaleme uygulamasıdır:

def ddply(rows, cols, op=lambda group_rows: group_rows): 
    """group rows by cols, then apply the function op to each group 
    rows is list of values or dict with col names (like read from 
    csv.reader or csv.DictReader)""" 
    def group_key(row):       
     return (row[col] for col in cols) 
    rows = sorted(rows, key=group_key) 
    return itertools.chain.from_iterable(
     op(group_rows) for k,group_rows in itertools.groupby(rows, key=group_key)) 

bir adım daha sum ve diğer yardımcı fonksiyonları gibi op olarak uygulanabilir önceden tanımlanmış fonksiyonları bir dizi var olacaktır.

+0

'Operatör' modülü, önceden oluşturulmuş işlevleriniz için kullanışlı olabilir. – Daenyth

+4

Eğer pandalar python modülünün üstüne yazabilirseniz, o zaman interneti (en azından gözlerimde) kazanabilirsiniz. –

+0

@MikeDewar: Bunun bir panda uygulaması var mı? – user248237dfsf

İlgili konular