Groupby在两个分类列的熊猫中计数-Pandas

时间:2020-08-31 15:36:49

标签: python-3.x pandas dataframe

我有df,如下所示。

df

ID      Type        Status       Age
1       2           P            23
2       1           P            28
3       1           F            33
4       3           P            48
5       1           F            23
6       2           P            28
7       2           F            23
8       3           P            38

从上面我想基于Status来对Type进行分组计数

预期输出:

Type     Status       Frequency
1        F            2
1        P            1
2        F            1
2        P            2
3        F            0
3        P            2

我尝试了以下代码

df.groupby('Type').agg('Status': 'size').\
        sort_values(ascending = False).reset_index()

2 个答案:

答案 0 :(得分:2)

我认为您想要value_counts

df.groupby('Type').Status.value_counts().reset_index(name='Frequency')

输出:

   Type Status  Frequency
0     1      F          2
1     1      P          1
2     2      P          2
3     2      F          1
4     3      P          2

或将reset_index替换为unstack以获取缺少的组:

df.groupby('Type').Status.value_counts().unstack(fill_value=0)

输出:

Status  F  P
Type        
1       2  1
2       1  2
3       0  2

注意df.groupby('Type').Status.value_counts()等效于df.groupby(['Type,'Status']).size()

答案 1 :(得分:1)

让我们尝试crosstab

pd.crosstab(df.Type, df.Status)
Out[268]: 
Status  F  P
Type        
1       2  1
2       1  2
3       0  2

pd.crosstab(df.Type, df.Status).stack().reset_index(name = 'freq')
Out[273]: 
   Type Status  freq
0     1      F     2
1     1      P     1
2     2      F     1
3     2      P     2
4     3      F     0
5     3      P     2