汇总不同列子集的计数

时间:2019-07-12 14:31:07

标签: pandas pandas-groupby

我有一个具有树结构的数据集,对于树中的每个路径,我想计算每个级别上的相应计数。这是一个具有两个级别的最小可重现示例。

import pandas as pd
data = pd.DataFrame()
data['level_1'] = np.random.choice(['1', '2', '3'], 100)
data['level_2'] = np.random.choice(['A', 'B', 'C'], 100)

我知道我可以通过这样做获得最后一级的计数

counts = data.groupby(['level_1','level_2']).size().reset_index(name='count_2')
print(counts)

    level_1 level_2 count_2
0   1       A       10
1   1       B       12
2   1       C       8
3   2       A       10
4   2       B       10
5   2       C       10
6   3       A       17
7   3       B       12
8   3       C       11

我想要的是一个数据帧,该数据帧在树中的每个可能路径上都有一行,并且在该路径的每个级别上都有计数。对于上面的示例,它类似于

    level_1 level_2 count_1 count_2
0   1       A       30      10
1   1       B       30      12
2   1       C       30      8
3   2       A       30      10
4   2       B       30      10
5   2       C       30      10
6   3       A       40      17
7   3       B       40      12
8   3       C       40      11

这是一个只有两个级别的示例,很容易解决,但是我想有一种方法可以获取任意数量级别的计数。

2 个答案:

答案 0 :(得分:1)

这将是transform

counts['count_1']=counts.groupby(['level_1']).count_2.transform('sum')
counts
Out[445]: 
  level_1 level_2  count_2  count_1
0       1       A        7       30
1       1       B       13       30
2       1       C       10       30
3       2       A        7       30
4       2       B        7       30
5       2       C       16       30
6       3       A        9       40
7       3       B       10       40
8       3       C       21       40

答案 1 :(得分:1)

您可以根据原始数据进行修改:

groups = data.groupby('level_1').level_2

pd.merge(groups.value_counts(),
         groups.size(),
         left_index=True,
         right_index=True)

给出:

                 level_2_x  level_2_y
level_1 level_2                      
1       A               14         39
        B               14         39
        C               11         39
2       C               13         34
        A               12         34
        B                9         34
3       B               12         27
        C                9         27
        A                6         27