首页 > 解决方案 > Pandas groupby 和对数据集的判断

问题描述

我有一个数据框,其中某些行被分类为“通过”或“失败”。我试图根据项目通过/失败的次数对项目做出总体判断。

熊猫 23.4 版

给定以下df:

*注意:存在其他几列,但为此目的,只有这两列很重要

Name    Judgement
A        Pass
A        Fail
A        Fail
A        Pass
X        Pass
X        Pass
Z        Pass
Z        Pass
Z        Fail
F        Pass

为了做出总体判断,我们查看每个项目通过/失败的次数。出现两次以上的项目只有在(# of pass == # of fail)的情况下才能判断为“总体通过”。曾经发生的项目无需进一步判断。

以下输出:

Name    Judgement
A        Pass
X        Pass
Z        Fail
F        Pass

注意A通过,因为它有 2 个通过和 2 个失败,所以 2/2 = 1 ==通过

Z失败,因为它有 2 次通过和 1 次失败,所以 2/1 = 2 ==失败

我的想法:

df['Name']在加入的同时进行 groupbyJudgement并简单地计算每个名称的每种判断类型出现的次数。有没有更清洁的方法来做到这一点?这个想法似乎有点麻烦,但这是我能想到的。

标签: pythonpandas

解决方案


这是我的方法:

new_df = df.Judgement.eq('Pass').groupby(df['Name']).agg({'size','mean', 'max'})

is_passed = ( # check those with more than two counts
             (new_df['mean'].eq(0.5) & new_df['size'].gt(2)) 

              # those with one or two counts pass if they have a pass
             | (new_df['size'].le(2) & new_df['max'])   
            )

产生:

Name
A     True
F     True
X     True
Z    False
dtype: bool

等效地,我们可以这样做:

is_passed = np.where(new_df['size'].le(2), new_df['max'] , new_df['mean'].eq(0.5))

你可以np.where用来掩盖passfail

np.where(is_passed, 'pass', 'fail')

推荐阅读