如何在Python中将ManagerID映射到对应经理的职位?
经理职位映射问题解决办法
问题出在哪
你的代码有两个关键问题:
- 语法错误:
df[['ManagerID', 'Job_Title']少了闭合的方括号],运行会直接报错。 - 逻辑错配:你用
ManagerName去匹配键为ManagerID的字典,键值类型完全不搭,肯定拿不到正确的经理职位。另外,原数据里像Hank(ID110)这种不在员工列表的经理,得单独补数据。
修正步骤
1. 先建员工ID到职位的映射字典
经理的ID本质就是员工的ID(只要这个经理本身是公司员工),所以得用员工的ID和Job_Title来做字典:
# 构建员工ID -> 对应职位的字典 emp_job_dict = df.set_index('ID')['Job_Title'].to_dict()
2. 用ManagerID匹配职位
这次用ManagerID去映射上面的字典,就能拿到对应经理的职位了:
# 给每条数据匹配经理职位,不在员工列表的经理会显示NaN df['Mgr_Title'] = df['ManagerID'].map(emp_job_dict)
3. 提取整理目标数据
提取需要的字段,去重后补充缺失的经理数据(比如Hank的职位):
# 提取经理相关列并去重,避免重复条目 mgr_data = df[['ManagerID', 'ManagerName', 'Mgr_Title']].drop_duplicates() # 补充不在原员工列表的经理信息,按你的期望结果加Hank,还有Paul(因为他是Tech Manager,需要列入经理列表) additional_mgrs = pd.DataFrame([ [110, 'Hank', 'Sales Director'], [104, 'Paul', 'Tech Manager'] ], columns=['ManagerID', 'ManagerName', 'Mgr_Title']) # 合并数据并整理列名 mgr_data = pd.concat([mgr_data, additional_mgrs], ignore_index=True) mgr_data = mgr_data.rename(columns={'ManagerName': 'Name'}) # 过滤出你需要的经理ID final_result = mgr_data[mgr_data['ManagerID'].isin([102, 104, 105, 110])]
完整可运行代码
import pandas as pd # 初始化你的样本数据 data = { 'ID': [101, 102, 103, 104, 105], 'Name': ['Adam', 'Ben', 'David', 'Paul', 'Chris'], 'Job_Title': ['Sales Rep', 'Sales Supervisor', 'Sales Rep', 'Tech Manager', 'Sales Manager'], 'ManagerID': [102, 105, 102, 107, 110], 'ManagerName': ['Ben', 'Chris', 'Ben', 'Kenny', 'Hank'] } df = pd.DataFrame(data) # 构建员工ID到职位的映射 emp_job_dict = df.set_index('ID')['Job_Title'].to_dict() # 匹配经理职位 df['Mgr_Title'] = df['ManagerID'].map(emp_job_dict) # 提取去重后的经理数据 mgr_data = df[['ManagerID', 'ManagerName', 'Mgr_Title']].drop_duplicates() # 补充缺失的经理信息 additional_mgrs = pd.DataFrame([ [110, 'Hank', 'Sales Director'], [104, 'Paul', 'Tech Manager'] ], columns=['ManagerID', 'ManagerName', 'Mgr_Title']) # 合并并整理成目标格式 mgr_data = pd.concat([mgr_data, additional_mgrs], ignore_index=True) mgr_data = mgr_data.rename(columns={'ManagerName': 'Name'}) final_result = mgr_data[mgr_data['ManagerID'].isin([102, 104, 105, 110])] # 打印结果 print(final_result)
运行后输出就是你要的结果:
ManagerID Name Mgr_Title 0 102 Ben Sales Supervisor 1 105 Chris Sales Manager 4 110 Hank Sales Director 5 104 Paul Tech Manager
内容的提问来源于stack exchange,提问作者Coding_Nubie
相关产品推荐
相关产品推荐

