如何在Pandas中基于两个DataFrame创建Vacancy条件列
解决员工空缺状态计算问题
数据集说明
DF1(全体员工及直属上级信息)
ID Name Status Manager ID Manager Name 101 Ashley Active 106 Kyle 102 Ben Non-Active 106 Kyle 103 Chris Non-Active 123 Taylor 104 Dave Non-Active 123 Taylor 105 Emily Active 167 Paul
DF2(涉及非活跃员工的经理信息)
Manager_ID Manager_Name Replacing Request Num 106 Kyle Ben 5678 138 Taylor Dave 1234
需求
创建名为Vacancy的新列,规则:
- 若DF1中存在状态为
Non-Active且未出现在DF2Replacing列中的员工,该员工对应的经理Vacancy值为1 - 其余情况
Vacancy值为0
期望输出:
Manager_ID Manager_Name Vacancy 106 Kyle 0 123 Taylor 1 167 Paul 0
原代码问题
你尝试的np.where(((df1['Status'] == 'Non-Active') & (df2['Replacing'].isna())),1,0)逻辑错误:
- DF1和DF2行数不匹配,直接按行关联会导致索引错位
- 未实现“非活跃员工是否在DF2 Replacing列”的判断逻辑,错误使用了
df2['Replacing'].isna()
解决方案代码
import pandas as pd # 构造数据集(如果已有数据可跳过这部分) df1 = pd.DataFrame({ 'ID': [101, 102, 103, 104, 105], 'Name': ['Ashley', 'Ben', 'Chris', 'Dave', 'Emily'], 'Status': ['Active', 'Non-Active', 'Non-Active', 'Non-Active', 'Active'], 'Manager ID': [106, 106, 123, 123, 167], 'Manager Name': ['Kyle', 'Kyle', 'Taylor', 'Taylor', 'Paul'] }) df2 = pd.DataFrame({ 'Manager_ID': [106, 138], 'Manager_Name': ['Kyle', 'Taylor'], 'Replacing': ['Ben', 'Dave'], 'Request Num': [5678, 1234] }) # 1. 筛选DF1中的非活跃员工 non_active = df1[df1['Status'] == 'Non-Active'] # 2. 找出未被DF2 Replacing列覆盖的非活跃员工 unreplaced = non_active[~non_active['Name'].isin(df2['Replacing'])] # 3. 获取这些员工对应的经理,标记Vacancy=1 vacancy_managers = unreplaced[['Manager ID', 'Manager Name']].drop_duplicates() vacancy_managers['Vacancy'] = 1 # 4. 整合所有经理信息,填充未匹配的经理Vacancy为0 all_managers = df1[['Manager ID', 'Manager Name']].drop_duplicates().rename( columns={'Manager ID': 'Manager_ID', 'Manager Name': 'Manager_Name'} ) result = pd.merge( all_managers, vacancy_managers, left_on=['Manager_ID', 'Manager_Name'], right_on=['Manager ID', 'Manager Name'], how='left' ) result['Vacancy'] = result['Vacancy'].fillna(0).astype(int) # 整理输出格式 final_result = result[['Manager_ID', 'Manager_Name', 'Vacancy']].sort_values('Manager_ID').reset_index(drop=True) print(final_result)
代码说明
- 先筛选非活跃员工,再排除掉DF2中已被
Replacing列记录的员工 - 提取这些未被替换的员工对应的经理,标记空缺状态
- 合并所有经理的信息,对没有空缺需求的经理填充
Vacancy=0 - 最后整理输出格式,得到期望结果
内容的提问来源于stack exchange,提问作者Coding_Nubie
相关产品推荐
相关产品推荐

