,
Class2Class3通过 ,,,Class2Class2 , Class2Class1 ,
我有一个像这样的数据框架
第一步是将所有cls分组在一个列中(不确定是否有多个cls列可以不同于--
,但这将在这里处理),并按Student ID
和Subject
分组:
df['cls'] = df[['prev cls', 'current cls', 'next cls']].agg(lambda x: [i for i in x if i!='--'], axis=1)
df = df.groupby(['Student ID', 'Subject'], as_index=False).agg({'Current class': 'last', 'cls': 'sum'})
这给了你df:
Student ID Subject Current class cls
0 101 English Class2 [Class2 Pass, Class3 Pass]
1 101 Mathematics Class 2 [Class 2 fail, Class 1 fail]
2 102 English Class 2 [Class2 Pass, Class 3 Fail]
3 102 Mathematics Class2 [Class2 fail, Class1 Pass]
从那里,您可以用一个函数转换cls
列,该函数将获得最大通过级别或最低失败级别:
import re
def get_expert_lvl(tests: list):
passed = [x for x in tests if 'pass' in x.lower()]
if passed:
return max(passed, key=lambda x: int(re.search(r'd+', x).group()))
else:
return min(tests, key=lambda x: int(re.search(r'd+', x).group()))
df['Expert lvl'] = df['cls'].transform(get_expert_lvl)
df.drop('cls', axis=1, inplace=True)
你最终得到:
Student ID Subject Current class Expert lvl
0 101 English Class2 Class3 Pass
1 101 Mathematics Class 2 Class 1 fail
2 102 English Class 2 Class2 Pass
3 102 Mathematics Class2 Class1 Pass