14

我发现 Hadley 的R 软件包plyr非常有用,它是一个用于转换数据的出色 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.groupbygroup by cols,然后应用该op功能,然后使用 itertools.chain 将其全部链接起来。有更好的解决方案吗?

4

1 回答 1

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、likesum和其他实用函数。

于 2011-06-22T02:11:57.790 回答