GroupBy中子类别的频率

2024-09-30 14:19:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框,如下所示:

enter image description here

首先我想得到CODE值的总体频率,称之为FREQ,然后是每个AXLE组中CODE值的频率,并称之为GROUP_FREQ

我能够使用以下代码计算FREQ列:

pivot = df[['AXLES','CODE']].pivot(['CODE']).agg(['count','mean','min','max'])
pivot['FREQ']=grouped_df.AXLES['count']/pivot.AXLES['count'].sum()*100`

这提供了一个很好的分组数据帧,如下所示:

enter image description here

然而,在下一步中,我不知道如何使用这个grouped_by数据帧计算每个AXLE组中的频率

我试过:

pivot['GROUPFREQ']=pivot['AXLES','mean']['count']/pivot['AXLES','mean']['count'].sum()*100

然而,这给出了一个KeyError: 'count'

我可能走错了路,我试图实现的目标可能无法用groupby实现。在花了几个小时的反复试验之后,我决定与社区进行核实。如果你能让我知道你的想法,我会很高兴的

谢谢

编辑:

可再现输入数据帧:

,CODE,AXLES
0,0101,5
1,001,4
2,0110111,8
3,010111,7
4,0100,5
5,0101,5
6,0110111,8
7,00111,6
8,00111,6
9,0110111,8
10,0100,5
11,0110011,8
12,01011,6
13,0110111,8
14,0110111,8
15,011011,7
16,011011,7
17,011011,7
18,01011,6
19,01011,6

pivot数据帧的所需输出:

CODE,COUNT,AXLES,FREQ,GROUPFREQ
001,1,4,0.05,1.00
00111,2,6,0.1,0.40
0100,2,5,0.1,0.50
0101,2,5,0.1,0.50
01011,3,6,0.15,0.60
010111,1,7,0.05,0.25
0110011,1,8,0.05,0.17
011011,3,7,0.15,0.75
0110111,5,8,0.25,0.83

对于输出的第一行: 001在整个数据集中仅出现一次(20条记录)。因此,频率=1/20=0.05 当数据按轴分组时,对于轴=4组,001是唯一的记录,因此GROUPFREQ=1/1=1.00。(不同轴组下不能出现相同的代码,因此只需检查轴=4的001。)


Tags: 数据代码dfcount记录codemean频率
1条回答
网友
1楼 · 发布于 2024-09-30 14:19:25

你是说:

pivot['FREQ'] = df.groupby('AXLES').CODE.value_counts(normalize=True).reset_index(level=0,drop=True)

输出:

       AXLES                   FREQ
       count mean min max          
CODE                               
1          1    4   4   4  1.000000
100        2    5   5   5  0.500000
101        2    5   5   5  0.500000
111        2    6   6   6  0.400000
1011       3    6   6   6  0.600000
10111      1    7   7   7  0.250000
11011      3    7   7   7  0.750000
110011     1    8   8   8  0.166667
110111     5    8   8   8  0.833333

相关问题 更多 >