在多行中比较Student ID并获得所需的输出



我有一个像这样的数据框架

, Class2Class3通过,,,Class2Class2,Class2Class1,

第一步是将所有cls分组在一个列中(不确定是否有多个cls列可以不同于--,但这将在这里处理),并按Student IDSubject分组:

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

最新更新