计算熊猫分组的频率

时间:2020-11-09 09:14:45

标签: python pandas

我有一个看起来像这样的数据框:

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

我获得了频率,但是它没有按照我想要的方式报告频率,而且我不确定如何从中获取频率并创建新的数据集。

有指导吗?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

async function actions(){
    await UIkit.notification({message: 'Notification message'});
    window.location.href='https://chatsales.nl/pakketten/doe-het-zelf?add-to-cart=420';
}

答案 2 :(得分:0)

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

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

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