我有这样的数据
id name sub marks
1 a m 52
1 a s 69
1 a p 63
2 b m 36
2 b s 52
2 b p 56
3 c m 85
3 c s 62
3 c p 56
我想要包含id,name和new column results等列的输出表(如果所有主题中的标记都大于40则使用标准然后该学生通过)
id name result
1 a pass
2 b fail
3 c pass
我想在python中这样做。
答案 0 :(得分:2)
从marks
创建一个布尔掩码,然后使用groupby
(id
和name
)+ all
:
import pandas as pd
df = pd.read_csv('file.csv')
v = df.assign(result=df.marks.gt(40))\
.groupby(['id', 'name'])\
.result\
.all()\
.reset_index()
v['result'] = np.where(v['result'], 'pass', 'fail')
v
id name result
0 1 a pass
1 2 b fail
2 3 c pass
答案 1 :(得分:1)
这是一种方式
In [127]: df.groupby(['id', 'name']).marks.agg(
lambda x: 'pass' if x.ge(40).all() else 'fail'
).reset_index(name='result')
Out[127]:
id name result
0 1 a pass
1 2 b fail
2 3 c pass
另一种方式,灵感来自jpp的解决方案,使用replace
或map
In [132]: df.groupby(['id', 'name']).marks.min().ge(40).replace(
{True: 'pass', False: 'fail'}
).reset_index(name='result')
Out[132]:
id name result
0 1 a pass
1 2 b fail
2 3 c pass
答案 2 :(得分:0)
这是通过pandas
的一种方式。请注意,您的标准等于40以上的最小标记。此算法在计算上更有效。
import pandas as pd
df = pd.read_csv('file.csv')
df = df.groupby(['id', 'name'])['marks'].apply(min).reset_index()
df['result'] = np.where(df['marks'] > 40, 'pass', 'fail')
df = df[['id', 'name', 'result']]
<强>结果强>
id name result
0 1 a pass
1 2 b fail
2 3 c pass
<强>解释强>
groupby.min()
和id
执行name
。