假设我订购了一些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

我需要做的是用符合申请要求的所需语言保留候选人及其技能,即:

  1. 具备上述两种语言的技能
  2. 这些语言的技能等于或高于词典中的值

因此,预期输出为:


    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))

…但在每种语言条件下,添加"高于"的难度很大.我真的很感谢你的帮助.

推荐答案

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

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      2

Python相关问答推荐

try 在树叶 map 上应用覆盖磁贴

Pandas - groupby字符串字段并按时间范围 Select

发生异常:TclMessage命令名称无效.!listbox"

为什么默认情况下所有Python类都是可调用的?

Polars:用氨纶的其他部分替换氨纶的部分

关于Python异步编程的问题和使用await/await def关键字

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

有没有一种ONE—LINER的方法给一个框架的每一行一个由整数和字符串组成的唯一id?

索引到 torch 张量,沿轴具有可变长度索引

CommandeError:模块numba没有属性generated_jit''''

如何使用Numpy. stracards重新编写滚动和?

Polars Group by描述扩展

如何在Gekko中使用分层条件约束

使用SeleniumBase保存和加载Cookie时出现问题

Matplotlib中的曲线箭头样式

无法使用请求模块从网页上抓取一些产品的名称

Pandas:使列中的列表大小与另一列中的列表大小相同

Python:在cmd中添加参数时的语法

如何在Polars中处理用户自定义函数的多行结果?

如何通过函数的强式路径动态导入函数?