2016-12-30 8 views
1

パンダでは、同じデータセットでマルチステップ/シーケンシャル集約を行う方法はありますか?各ステップが次のものの「副問い合わせ」であるかのように。パンダのデータフレームにおける複数ステップの集計

は、私がこのようにSQLで考えることができ

import pandas 
import numpy 

numpy.random.seed(1) 
df = pandas.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 
          'foo', 'bar', 'foo', 'foo'], 
        'B' : ['one', 'one', 'two', 'three', 
          'two', 'two', 'one', 'three'], 
        'C' : numpy.random.randn(8), 
        'D' : numpy.random.randn(8)}) 

私が集約しようとしました:

SELECT x.A, COUNT(x.B) as B_COUNT, SUM(x.C_SUM) as C_SUM 
FROM (
    SELECT df.A, df.B, SUM(df.C) as C_SUM 
    FROM df 
    GROUP BY df.A, df.B 
) x 
GROUP BY x.A 

Python3.4とPandas0.19.2での作業は、私はこのようなデータフレームを持っていますA、Bレベルに変換し、そのデータフレームを処理します(ただしインデックスは 'C'、カラム 'A'はキーのリストにないのでKeyErrorをスローします)。

A_B_AGG = df.groupby(['A','B']).C.sum().to_frame() 
A_B_AGG.keys() 
#Index(['C'], dtype='object') 
#Would like to do this, but throws KeyError 
end_result = A_B_AGG.groupby('A').B.size() 

最終的に、私は次のようになります何かを得る必要があります...

A B_COUNT  C_SUM 
bar  3 -3.986264 
foo  3 2.945186 

は、これを行うための適切な、パンダの途中で何らかの指導をありがとう!

答えて

1

あなたはagg機能を使用することができます。

df.groupby('A').agg({'B': pandas.Series.nunique, 'C': 'sum'}) 

#    C B 
#A  
#bar -3.986264 3 
#foo  2.945186 3 

私はこれがあなたのSQLクエリと同等だと思う理由は、あなたが、カラムAとBでグループを行う際には、それぞれにBのない重複がないことですグループ。したがって、Aでグループ化されたBのカウントは、Aでグループ化されたBの一意のカウントと同じになります。 C sumの場合、サブグループの合計はグループの合計と同じです。


これで私は上記の方法と論理的に等価だと思うあなたのSQLクエリの直接の翻訳:

(df.groupby(['A', 'B']).C.sum().reset_index() 
    .groupby('A').agg({'B': 'count', 'C': 'sum'})) 

#    C B 
# A  
#bar -3.986264 3 
#foo  2.945186 3 
+0

あなたは 'C.sumは()'何が他の列に起こるのですか? 'D'列はどうなりますか?あなたはgroupbyをするときにいくつかの列を集約し、他を残すことはできますか? – MYGz

+1

@MYGzこれらは無視されます。 groupby(...)を実行すると、Cはグループ変数とともに列 'C'を選択したことを意味します。 – Psidom

+0

ありがとう!だから、別の列に異なる種類の集約が必要な場合は、 '.agg()'を使用する必要があります。 – MYGz

関連する問題