2016-07-26 71 views
2

我有一个数据帧:大熊猫由每个类别计算的计数和总和组

category num1 num2 mark 
1 A 2 2 0 
2 B 3 3 1 
3 C 4 2 2 
4 C 3 5 2 
5 D 6 8 0 
6 E 7 5 1 
7 D 8 1 1 

我想由标记来计算每个类别组的计数数目(作为列),如:

the counts:   

    catgory mark_0 mark_1 mark_2 
    A 1 0 0 
    B 0 1 0 
    C 0 0 2 
    D 0 2 0 
    E 0 1 0 

另一个是由上述标记计算每个类别组的数目的总和(作为列),如:

the sum:    
    category numsum_0 numsum_1 numsum_2 
     A 2 0 0 
     B 0 3 0 
     C 0 0 7 
     D 0 14 0 
     E 0 7 0 

,我的方法是:

df_z[df_z['mark']==0]['category'].value_counts() 
df_z[df_z['mark']==0].groupby(['category'], sort=False).sum() 

,但它是低效

回答

3
>>> pd.pivot_table(df,index=['category'],columns=['mark'],aggfunc=len).fillna(0) 
      num 
mark  0 1 2 
category 
A   1.0 0.0 0.0 
B   0.0 1.0 0.0 
C   0.0 0.0 2.0 
D   1.0 1.0 0.0 
E   0.0 1.0 0.0 

>>> pd.pivot_table(df,index=['category'],columns=['mark'],aggfunc=np.sum).fillna(0) 
      num 
mark  0 1 2 
category 
A   2.0 0.0 0.0 
B   0.0 3.0 0.0 
C   0.0 0.0 7.0 
D   6.0 8.0 0.0 
E   0.0 7.0 0.0 
+0

我们可以改变 '男' 为0? –

+0

当然,我只是更新了答案。 – bernie

+0

如果这里有两个num列:num1和num2,我们可以通过指定的num1或num2来计算总和吗?? –

2

使用agg

idx_cols = ['category', 'mark'] 
agg_dict = {'num1': {'Sum': 'sum'}, 'num2': {'Count': 'count'}} 

df.set_index(idx_cols).groupby(level=[0, 1]).agg(agg_dict).unstack() 

enter image description here

+0

+1。我认为,它需要更多的工作。如果我到达任何地方,我会尝试继续停留,并发表其他评论。 – bernie

+1

@bernie thx,我已经把它整理出来了。 – piRSquared