是否有Hadley用于python的ddply的实现?

时间:2011-06-22 01:50:03

标签: python r plyr

我发现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.groupbycols进行分组,然后应用op函数,然后使用itertools.chain将其全部链接起来。有更好的解决方案吗?

1 个答案:

答案 0 :(得分:8)

这是我起草的实施:

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和其他效用函数。