首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫群与数据集判断

熊猫群与数据集判断
EN

Stack Overflow用户
提问于 2019-07-12 13:46:30
回答 5查看 315关注 0票数 2

我有一个数据文件,其中某些行被分类为'pass‘或'fail’。我正试图根据项目通过/失败的次数,对项目进行全面的判断。

熊猫ver 23.4

考虑到以下df:

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

代码语言:javascript
复制
Name    Judgement
A        Pass
A        Fail
A        Fail
A        Pass
X        Pass
X        Pass
Z        Pass
Z        Pass
Z        Fail
F        Pass

为了作出全面的判断,我们看一下每一项通过/失败的次数。发生超过两次的项只能被判断为“总体传递”,如果(失败的pass == #)。一旦发生的项目不需要进一步判断。

Ex产出如下:

代码语言:javascript
复制
Name    Judgement
A        Pass
X        Pass
Z        Fail
F        Pass

注意A传递,因为它有2次传递和2次失败,所以2/2 =1 == Pass

Z失败是因为它有2次Pass和1次失败SO2/1=2 == fails

我的想法:

df['Name']上做一个groupby,同时也加入Judgement,简单地计算每个名称的每个判断类型发生的次数。有更干净的方法吗?这个想法似乎有点麻烦,但这是我唯一能想到的。

EN

回答 5

Stack Overflow用户

发布于 2019-07-12 13:55:13

这就是你所需要的吗? 0.5表示它们相等,1表示所有项目都通过,这两个条件产生传递

代码语言:javascript
复制
s=df.Judgement.eq('Pass').groupby(df['Name']).agg(['mean','count'])
((s['mean'].eq(1)&s['count'].le(2))|s['mean'].eq(0.5)).map({True:'Pass',False:'Fail'})
Out[436]: 
Name
A    Pass
F    Pass
X    Pass
Z    Fail
dtype: object
票数 2
EN

Stack Overflow用户

发布于 2019-07-12 14:22:02

我的方法是:

代码语言:javascript
复制
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'])   
            )

产生的结果:

代码语言:javascript
复制
Name
A     True
F     True
X     True
Z    False
dtype: bool

同样,我们可以:

代码语言:javascript
复制
is_passed = np.where(new_df['size'].le(2), new_df['max'] , new_df['mean'].eq(0.5))

您可以使用np.where来屏蔽passfail

代码语言:javascript
复制
np.where(is_passed, 'pass', 'fail')
票数 2
EN

Stack Overflow用户

发布于 2019-07-12 13:58:19

使用自定义的apply函数:

代码语言:javascript
复制
In [334]: def compare_pass_fail(x):
     ...:     v_counts = x['Judgement'].value_counts()
     ...:     return 'Pass' if ('Fail' not in v_counts or v_counts.get('Pass') == v_counts['Fail']) else 'Fail'
     ...: 
In [335]: df.groupby('Name').apply(compare_pass_fail)
Out[335]: 
Name
A    Pass
F    Pass
X    Pass
Z    Fail
dtype: object
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57008284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档