Python 熊猫按每个类别计算计数和总和组

Python 熊猫按每个类别计算计数和总和组,python,pandas,Python,Pandas,我有一个数据帧: 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 我想通过标记(作为列)计算每个类别组的计数,如: 另一种方法是通过标记(作为列)计算每个类别组的数字总和,如下所示: 我的方法是: df_z[df_z['

我有一个数据帧:

    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
我想通过标记(作为列)计算每个类别组的计数,如:

另一种方法是通过标记(作为列)计算每个类别组的数字总和,如下所示:

我的方法是:

df_z[df_z['mark']==0]['category'].value_counts()
df_z[df_z['mark']==0].groupby(['category'], sort=False).sum()
但是它是低效的

使用
agg

>>> 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
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()

我们可以将“nan”改为0吗?如果这里有两个num列:num1和num2,我们可以通过指定的num1或num2计算总和吗?直到您可以提供一个函数列表作为
aggfunc
kwarg,例如
pd.pivot\u表(df,index=['category'],columns=['mark'],aggfunc=[len,np.sum])。fillna(0)
>>> 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
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()