假设我为一些编码语言的专家订购了JSON格式的多种标准:
request = {'languages_required': {'Python': 4,
'Java': 2},
'other_requests': []
}languages_required意味着候选人必须具备语言技能,而数字是这种语言的最低水平。
候选人数据格式很长:
df = pd.DataFrame({'candidate': ['a', 'a', 'a', 'b', 'b', 'c', 'c', 'd', 'd', 'd'],
'language': ['Python', 'Java', 'Scala', 'Python', 'R', 'Python', 'Java', 'Python', 'Scala', 'Java'],
'skill': [5, 4, 4, 6, 8, 1, 3, 5, 2, 2]})这意味着:
candidate language skill
0 a Python 5
1 a Java 4
2 a Scala 4
3 b Python 6
4 b R 8
5 c Python 1
6 c Java 3
7 d Python 5
8 d Scala 2
9 d Java 2我需要做的是保持候选人和他们的技能以符合要求的语言,即:
在上述两种语言中,languages
中的值。
因此,所需的输出将是:
candidate language skill
0 a Python 5
1 a Java 4
7 d Python 5
9 d Java 2我能够根据字典的键()过滤候选人的语言:
lang_mask = df[df['language'].isin(request['languages_required'].keys())]\
.groupby('candidate')['language']\
.apply(lambda x: set(request['languages_required']).issubset(x))但是,在每种语言条件下添加“都高于”这一条件是很困难的。
发布于 2022-07-22 10:13:48
您需要在一个步骤中调用第一个条件,然后在另一个步骤调用第二个条件:
df = df[df['language'].map(request['languages_required']).le(df['skill'])]
df = df[df.groupby('candidate')['language'].transform(lambda x: set(request['languages_required']).issubset(x))]
print (df)
candidate language skill
0 a Python 5
1 a Java 4
7 d Python 5
9 d Java 2或一行解决方案:
df = (df[df['language'].map(request['languages_required']).le(df['skill'])]
.pipe(lambda x: x[x.groupby('candidate')['language'].transform(lambda x: set(request['languages_required']).issubset(x))]))
print (df)
candidate language skill
0 a Python 5
1 a Java 4
7 d Python 5
9 d Java 2https://stackoverflow.com/questions/73078568
复制相似问题