2017-02-15 12 views
1

これはデータフレームです:各グループごとのエントリ数と合計の計算方法は?

GROUP TIME EVAL 
AAA  20 0 
AAA  22 0 
AAA  21 1 
AAA  20 0 
BBB  20 0 

私は各グループに属しており、どのように多くのエントリが各グループで1に等しいEVALを持っているどのように多くのエントリを見てみたいです。私はコードをほぼ完成させましたが、グループごとのエントリ数をどのように数えるか分かりません。私はそれを作成したいが、それは列TOTAL_CALLSを検索するようだ。あなたがlambdaboolean mask使用することができます

final = df.groupby(['GROUP']).agg({'TIME':'mean','EVAL':'sum','TOTAL_NUM':'count'}).reset_index() 

答えて

1

Time列そのものを使用して

final = df.groupby(['GROUP']).agg({'TIME':['mean', 'size'], 
            'EVAL': [lambda x: (x == 1).sum(), 'sum']}) 
final = final.rename(columns={'<lambda>':'size_of_1'}) 
final.columns = final.columns.map('_'.join) 
final = final.reset_index() 
print (final) 
    GROUP EVAL_size_of_1 EVAL_sum TIME_mean TIME_size 
0 AAA    1   1  20.75   4 
1 BBB    0   0  20.00   1 
+0

? – Dinosaurius

+0

'TOTAL_NUM'という列は存在しないため、作成します。この列には、特定のグループに属している行の総数を入れたいと思います。例えば、 'AAA、21、0、4'のようになります。ここで' 4'はこの組み合わせが現れる回数です。したがって、この例では、 'TOTAL_NUM'は' 4'です。 – Dinosaurius

+0

私は 'value_counts()'や '.size()。to_frame( 'TOTAL_NUM')'のようなものを使うべきでしょうか? – Dinosaurius

1

を、我々はレコード数の両方を検索し、各グループの時間を意味します。これは、列['mean'、 'count']を列に送信することで実現できます。その後、グループごとにEvalの合計を別の列として見つけることができました。あなたはグループごとの行数をカウントしない

new= data.groupby(['Group']).agg({'Time':['mean','count'],'Eval' : 'sum'}).reset_index() 
    print(new) 

    Group Eval Time  
     sum mean count 
0 AAA 1 20.75  4 
1 BBB 0 20.00  1 
+2

これは質問に答えるように見えます。あなたはもう少し書かれた説明を提供できますか?それは、OPとあなたの答えの質の両方を助けるでしょう。 – rajah9

1
df: 
    EVAL GROUP TIME 
0 0  AAA 20 
1 0  AAA 22 
2 1  AAA 21 
3 0  AAA 20 
4 0  BBB 20  

# group by 'GROUP' 
gb = df.groupby('GROUP') 

# aggregate each column by method 
final = gb.agg({'GROUP': 'count', 
       'EVAL': 'sum', 
       'TIME': 'mean'}) 

# rename columns and reset index 
final = final.rename(columns={'GROUP': 'GROUP_TOTAL', 
           'EVAL': 'EVAL_COUNT', 
           'TIME': 'TIME_AVG'}).reset_index() 

out: 
    GROUP EVAL_COUNT TIME_AVG GROUP_TOTAL 
0 AAA 1   20.7500 4   
1 BBB 0   20.0000 1