2011-06-22 14 views
14

El paquete plyr de Hadley para R es extremadamente útil, es una gran DSL para transformar datos. El problema que se resuelve es tan común, que lo enfrento a otros casos de uso, cuando no manipulo datos en R, pero en otros lenguajes de programación.¿Hay una implementación de ddply de Hadley para python?

¿Alguien sabe si existe un módulo que hace algo similar para python? Algo así como:

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 

No debería ser demasiado difícil de implementar, pero sería genial si ya existía. Lo implementaría, usaría itertools.groupby para agrupar por cols, luego aplicaría la función op, luego usar itertools.chain para encadenarlo todo. ¿Hay una mejor solución?

Respuesta

8

Ésta es la aplicación redacté arriba:

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)) 

Otro paso sería contar con un conjunto de funciones predefinidas que podrían ser aplicadas como op, como sum y otras funciones de utilidad.

+0

El módulo 'operator' puede ser útil para sus funciones prefabricadas. – Daenyth

+4

Si pudieras escribir esto sobre el módulo panda python entonces podrías ganar Internet (en mi opinión, al menos) –

+0

@MikeDewar: ¿Hay una implementación de pandas de esto? – user248237dfsf

Cuestiones relacionadas