2011-06-22 8 views
14

私は、RのためのHadleyのplyrパッケージが非常に役に立ち、データを変換するための素晴らしいDSLを見つけました。解決している問題は非常に一般的なので、Rのデータを操作していないときには他のプログラミング言語でデータを操作することになります。HadleyのPython用のddplyの実装はありますか?

誰かが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 

実装するのは難しいはずはありませんが、すでに存在していれば素晴らしいでしょう。私はそれを実装するだろう、私はcolsでグループ化するためにitertools.groupbyを使用し、その後、op関数を適用し、itertools.chainを使用してすべてをチェーンする。より良い解決策はありますか?

答えて

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

を別のステップは、sumおよびその他のユーティリティ機能のように、opとして適用することができ、定義済み関数のセットを持っているだろう。

+0

'operator'モジュールは、あなたのpremade関数のために便利です。 – Daenyth

+4

これをパンダのpythonモジュールの上に書くことができれば、あなたはインターネットに勝つかもしれません(少なくとも私の目では) –

+0

@MikeDewar:これのパンダの実装はありますか? – user248237dfsf

関連する問題