有没有Python中与Hadley的ddply相似的实现?

14

我发现 Hadley 的 plyr 包对于 R 来说非常有用,它是一个用于转换数据的优秀 DSL。它解决的问题非常普遍,以至于在不使用 R 操作数据的其他编程语言中,我也会面临这个问题。

请问是否有类似于 plyr 的 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个回答

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


operator 模块可能对您的预制函数很有用。 - Daenyth
4
如果你能在 pandas Python 模块上加以改进,那么你可能会在互联网上赢得一些声誉(至少在我看来是这样)。 - Mike Dewar
@MikeDewar:这个有pandas的实现吗? - user248237
我使用 Pandas 的 pivot_table 函数。http://pandas.pydata.org/pandas-docs/stable/reshaping.html - KLDavenport
我尝试过这个,但它没有起作用。我只是想将一个框架缩小到其组,并创建一个包含分组列的列表。假设我有一个数据框,其中包含我在整个月份中每天吃的饭菜。我希望能够按周日对其进行分组,并列出所有的餐点,例如:星期一:[鸡蛋、牛奶、意大利面]。我该如何在Python中实现这个功能? - Eduardo Reis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接