首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据字典中的条件过滤长格式Pandas DF

根据字典中的条件过滤长格式Pandas DF
EN

Stack Overflow用户
提问于 2022-07-22 10:05:16
回答 1查看 70关注 0票数 4

假设我为一些编码语言的专家订购了JSON格式的多种标准:

代码语言:javascript
复制
request = {'languages_required': {'Python': 4,
                                  'Java': 2},
           'other_requests': []
          }

languages_required意味着候选人必须具备语言技能,而数字是这种语言的最低水平。

候选人数据格式很长:

代码语言:javascript
复制
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]})

这意味着:

代码语言:javascript
复制
    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

  • Skills都具有
  1. 的技能,这些语言中的值等于或高于字典

中的值。

因此,所需的输出将是:

代码语言:javascript
复制
    candidate   language    skill
0       a       Python      5
1       a       Java        4
7       d       Python      5
9       d       Java        2

我能够根据字典的键()过滤候选人的语言:

代码语言:javascript
复制
lang_mask = df[df['language'].isin(request['languages_required'].keys())]\
                                                                         .groupby('candidate')['language']\
                                                                         .apply(lambda x: set(request['languages_required']).issubset(x))

但是,在每种语言条件下添加“都高于”这一条件是很困难的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-22 10:13:48

您需要在一个步骤中调用第一个条件,然后在另一个步骤调用第二个条件:

代码语言:javascript
复制
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

或一行解决方案:

代码语言:javascript
复制
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      2
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73078568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档