2017-02-15 133 views
1

這是數據框:如何計算每個組的總數和總數?

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

我想看看有多少項目屬於每個分組多少條目每個羣組有EVAL等於1。我幾乎完成了代碼,但不確定如何統計每個組的條目。它似乎搜索列TOTAL_CALLS,而我想創建它。

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

回答

1

您可以使用lambda,總結boolean mask

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

使用Time柱本身,我們發現這兩個號碼的記錄,平均時間爲每個組。這可以通過向該列發送列表['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