稀疏矩阵构建:职位重复与or条件匹配的DataFrame处理求助
解决方案代码实现
1. 预处理职位需求:解析数字前缀与OR逻辑
先实现一个函数,把带数字前缀和OR逻辑的职位字符串转换成标准化的职位列表:
import re import pandas as pd def parse_position_str(pos_str): # 拆分OR逻辑的多个职位选项 pos_options = [opt.strip() for opt in pos_str.split('or')] parsed_positions = [] for opt in pos_options: # 提取数字前缀(如"3 Auditor"中的3) match = re.match(r'(\d+)\s+(.*)', opt) if match: count = int(match.group(1)) role = match.group(2).strip() # 按指定次数重复职位 parsed_positions.extend([role]*count) else: # 无数字前缀,直接加入列表 parsed_positions.append(opt.strip()) return parsed_positions
2. 展开分支的职位需求
假设你的Branch_A数据集(命名为branch_df)有一列position_list是拆分好的字典列表,每个字典包含role字段(即待处理的职位字符串)。我们将所有职位需求展开为扁平结构:
# 示例Branch_A数据 branch_df = pd.DataFrame({ 'branch_id': ['A001', 'A002'], 'position_list': [ [{'role': '2 Auditor or Auditor(S)'}, {'role': '1 Accountant'}], [{'role': '3 HR Specialist or HR Coordinator'}] ] }) # 展开并解析所有职位需求 expanded_positions = [] for idx, row in branch_df.iterrows(): for pos_dict in row['position_list']: parsed_roles = parse_position_str(pos_dict['role']) for role in parsed_roles: expanded_positions.append({ 'branch_id': row['branch_id'], 'standard_role': role }) # 转换为结构化DataFrame expanded_df = pd.DataFrame(expanded_positions)
3. 匹配员工数据集并构建稀疏矩阵
假设员工数据集(employee_df)包含employee_id和job_title字段,通过等价职位映射实现OR逻辑匹配,最终生成0-1稀疏矩阵:
# 示例员工数据 employee_df = pd.DataFrame({ 'employee_id': ['E001', 'E002', 'E003', 'E004', 'E005'], 'job_title': ['Auditor', 'Auditor(S)', 'Accountant', 'HR Specialist', 'HR Coordinator'] }) # 定义OR逻辑的等价职位组,可根据需求扩展 role_mapping = { 'Auditor': ['Auditor', 'Auditor(S)'], 'Auditor(S)': ['Auditor', 'Auditor(S)'], 'HR Specialist': ['HR Specialist', 'HR Coordinator'], 'HR Coordinator': ['HR Specialist', 'HR Coordinator'] } # 为每个员工标记所属的等价职位组 employee_df['role_group'] = employee_df['job_title'].map(lambda x: role_mapping.get(x, [x])) # 交叉匹配分支需求与员工 matches = [] for _, branch_row in expanded_df.iterrows(): for _, emp_row in employee_df.iterrows(): if branch_row['standard_role'] in emp_row['role_group']: matches.append({ 'branch_id': branch_row['branch_id'], 'employee_id': emp_row['employee_id'], 'match': 1 }) # 构建稀疏矩阵 sparse_matrix = pd.pivot_table( matches, index='branch_id', columns='employee_id', values='match', fill_value=0 )
关键说明
- 数字前缀处理:通过正则提取数字,将职位按指定次数重复,保证需求数量准确。
- OR逻辑匹配:通过
role_mapping定义等价职位组,只要员工职位属于目标职位的等价组即视为匹配;若需要更灵活的模糊匹配,可将映射替换为正则匹配逻辑(如用re.search判断职位是否符合模式)。 - 稀疏矩阵构建:利用
pivot_table快速生成0-1矩阵,未匹配位置自动填充0。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

