Есть ли реализация Hadley ddply для python?

Я нахожу Hadley plyr пакет для R чрезвычайно полезен, его отличная DSL для преобразования данных. Проблема, которая решает, настолько распространена, что я сталкиваюсь с ней в других случаях использования, когда не обрабатываю данные в R, а на других языках программирования.

Кто-нибудь знает, существует ли модуль, который делает подобную вещь для python? Что-то вроде:

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

Это не должно быть слишком сложно реализовать, но было бы здорово, если бы оно уже существовало. Я бы это использовал, я бы использовал itertools.groupby для группировки по cols, затем применил функцию op, а затем использовал itertools.chain, чтобы связать все это. Есть ли лучшее решение?

Ответы

Ответ 1

Это реализация, которую я разработал:

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

Другим шагом было бы иметь набор предопределенных функций, которые могли бы применяться как op, например sum и другие служебные функции.