2016-07-27 9 views
2

私は、次のような単純なテーブルを持っている場合:私は2つのまたは3つのbのIE、私は基本的に使用されている、場所に重複レコードを集約したい場合高度な集約パンダパイソン

index location  col1 col2 col3 col4 
    1   a  TRUE yes  1  4 
    2   a FALSE null  2  6 
    3   b  TRUE null  6  3 
    4   b  TRUE  no  3  4 
    5   b FALSE yes  4  6 
    6   c  TRUE  no  57  8 
    7   d FALSE null  74  9 

groupby関数。これは簡単なテーブルでうまくいきます。

ただし、この機能を拡張して、列ごとにルールを集約することは可能ですか? col1の例として、TRUEが存在する場合はFALSE値を上回り、col3では値を合計しますがcol4では平均値を加算します。 groupbyを使用するときに列ごとにこれらのルールを定義して適用することは可能ですか?

私はオンラインで検索しましたが、これをカバーしていると思われるものは見つかりませんでしたが、間違ったツリーを拾っている可能性があります。

ありがとうございました。

+0

希望/期待データセットを投稿できますか? – MaxU

答えて

4

使用groupbyagg

funcs = dict(
    col1=dict(Trump=lambda x: x.any()), 
    col3='sum', 
    col4=dict(Avg='mean') 
) 

df.groupby('location').agg(funcs) 

enter image description here


複数の列を持つgroupbyオブジェクトにaggを使用している場合、あなたはどの列に適用する機能を定義dictを渡すことができます。

この高水準辞書(funcs)では、キーは値に定義されている関数を適用するための既存の列名です。例えば

agg({'col1': lambda x: x.any(), 'col2': 'sum'}) 

col2col1sumany()を使用することを言います。 col1またはcol2がデータフレームに存在しない場合、これは失敗します。

さらに、この集約に由来するデフォルトの列名を使用する必要はありませんでした。私は説明するために上のミニサンプルを実行します。

df.groupby('location').agg({'col1': lambda x: x.any(), 'col3': 'sum'}) 

enter image description here

私たちが何をやったかについて多くの記述がありません。代わりに機能として辞書を渡すと、キーは説明であり、値は関数です。私は同じ例を使用しますが、より良い説明でそれを展開します。

df.groupby('location').agg(
    {'col1': {'All I need is one True': lambda x: x.any()}, 
    'col3': {'SUMMATION': 'sum'}}) 

enter image description here

その情報を武器に、うまくいけば私の解決策は完璧な理にかなっています。

+0

++心の読み方;) – MaxU

+0

@MaxUありがとう:-) – piRSquared

+0

@piRSquared何か素晴らしい答え!タイムアウトを取ってくれてありがとう! :D – DGraham