大Pandas群体的计数频率

2024-09-26 22:51:29 发布

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

我有一个如下所示的数据帧:

     a     b     c        result
0    80    50    10000    pass
1    80    50    10000    pass
2    100   50    10000    pass
3    100   50    10000    fail
...
XX   110   70    15000    pass
XX   110   70    15000    pass
XX   110   80    10000    fail
XX   110   80    10000    fail

我想得到数据帧的每个组合(a、b、c)的“通过”频率(单位%)。 例如,上述数据集应导致

     a     b     c        passFreq
0    80    50    10000    1.0
1    100   50    10000    0.5
...
2    110   70    15000    1.0
3    110   80    10000    0.0  

如果我这样做

df.groupby(['a', 'b', 'c']).describe()

我得到了频率,但它没有按照我想要的方式报告,我不知道如何检索频率并从中创建新的数据集

有什么指导吗


Tags: 数据df报告方式单位passresult频率
3条回答
df.groupby(['a', 'b', 'c'])['result'].mean()

您需要选择列pass,然后应用.mean().reset_index(drop=True)重置索引:

df.groupby(['a', 'b', 'c'])['result'].mean().reset_index(drop=True)

如果你需要.describe,你也可以这样做

如果需要使用^{}result的所有值的百分比,请使用^{}

print (pd.crosstab([df['a'], df['b'], df['c']], df['result'], normalize=0))
result        fail  pass
a   b  c                
80  50 10000   0.0   1.0
100 50 10000   0.5   0.5
110 70 15000   0.0   1.0
    80 10000   1.0   0.0

df2 = (pd.crosstab([df['a'], df['b'], df['c']], 
                  df['result'], normalize=0)
        .reset_index()
        .rename_axis(None, axis=1))
print (df2)
     a   b      c  fail  pass
0   80  50  10000   0.0   1.0
1  100  50  10000   0.5   0.5
2  110  70  15000   0.0   1.0
3  110  80  10000   1.0   0.0

如果只需要pass首先将值与新列进行比较,然后聚合mean

df1 = (df.assign(new = df['result'].eq('pass'))
         .groupby(['a', 'b', 'c'])['new']
         .mean()
         .reset_index(name='pass'))
print (df1)
     a   b      c  pass
0   80  50  10000   1.0
1  100  50  10000   0.5
2  110  70  15000   1.0
3  110  80  10000   0.0

相关问题 更多 >

    热门问题