python-3.x 如何在Pandas中获取一个 Dataframe 中存在而第二个 Dataframe 中不存在的行列表

z9smfwbn  于 2023-04-13  发布在  Python
关注(0)|答案(2)|浏览(215)

我有两个dataframes -一个是数据库,另一个是实际的列表。数据库:list of skills
| 技能|
| --------------|
| 技术1|
| 技能2|
| 技术3|
| 技术4|
列表:list of pairs
| 工人|工人技能|
| --------------|--------------|
| 员工1|技术1|
| 员工1|技能2|
| 员工1|技术3|
| 员工2|技能2|
| 员工2|技术3|
| 员工2|技术4|
| 员工3|技术1|
| 员工3|技术3|
| 员工3|技术4|
如何获得数据库中但不在列表中的工人技能对列表?:what I need
| 工人|他们没有的技能|
| --------------|--------------|
| 员工1|技术4|
| 员工2|技术1|
| 员工3|技能2|
我尝试了不同的合并和删除重复项的方法,但是,由于实际的工人列表很长,重复项存在于技能列表中。

eulz3vhy

eulz3vhy1#

一种方法是创建一个包含所有worker和skills的dataframe(通过交叉连接它们),然后将其连接到worker df以查找哪些组合不存在;这是每个工人都不具备的技能

workers = pd.DataFrame({
    'worker': ['worker1', 'worker1', 'worker1', 'worker2', 'worker2', 'worker2', 'worker3', 'worker3', 'worker3'],
    'skills_of_worker': ['skill1', 'skill2', 'skill3', 'skill2', 'skill3', 'skill4', 'skill1', 'skill3', 'skill4']
})
skills = pd.DataFrame({'skills': ['skill1', 'skill2', 'skill3', 'skill4']})

all_workers = pd.Series(workers['worker'].unique(), name='worker')
res = skills.merge(all_workers, how='cross').merge(workers, how='left', left_on=['worker', 'skills'], right_on=['worker', 'skills_of_worker'])
res = res[res['skills_of_worker'].isna()].drop('skills_of_worker', axis=1).rename(columns={'skills':'skills_they_dont_have'}).reset_index(drop=True)

输出:

skills_they_dont_have   worker
0                skill1  worker2
1                skill2  worker3
2                skill4  worker1
kpbpu008

kpbpu0082#

我会使用set操作(difference),然后explode

skills = {'skill1', 'skill2', 'skill3', 'skill4'}

out = (
  df.groupby('worker', as_index=False)['skills_of_worker']
   .agg(skills.difference)
   .explode('skills_of_worker')
   .rename(columns={'skills_of_worker': 'skills_they_dont_have'})
)

输出:

worker skills_they_dont_have
0  worker1                skill4
1  worker2                skill1
2  worker3                skill2

相关问题