我有一个数据文件,其中某些行被分类为'pass‘或'fail’。我正试图根据项目通过/失败的次数,对项目进行全面的判断。
熊猫ver 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为了作出全面的判断,我们看一下每一项通过/失败的次数。发生超过两次的项只能被判断为“总体传递”,如果(失败的pass == #)。一旦发生的项目不需要进一步判断。
Ex产出如下:
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,简单地计算每个名称的每个判断类型发生的次数。有更干净的方法吗?这个想法似乎有点麻烦,但这是我唯一能想到的。
发布于 2019-07-12 13:55:13
这就是你所需要的吗? 0.5表示它们相等,1表示所有项目都通过,这两个条件产生传递
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发布于 2019-07-12 14:22:02
我的方法是:
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来屏蔽pass,fail
np.where(is_passed, 'pass', 'fail')发布于 2019-07-12 13:58:19
使用自定义的apply函数:
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: objecthttps://stackoverflow.com/questions/57008284
复制相似问题