You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)逻辑错误:

  1. DF1和DF2行数不匹配,直接按行关联会导致索引错位
  2. 未实现“非活跃员工是否在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)

代码说明

  1. 先筛选非活跃员工,再排除掉DF2中已被Replacing列记录的员工
  2. 提取这些未被替换的员工对应的经理,标记空缺状态
  3. 合并所有经理的信息,对没有空缺需求的经理填充Vacancy=0
  4. 最后整理输出格式,得到期望结果

内容的提问来源于stack exchange,提问作者Coding_Nubie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:22:20