如何创建函数遍历经理层级列填充DataFrame的attrition_rate NaN值?
解决方案:基于经理层级向上填充attrition_rate缺失值
前提假设
先明确两个DataFrame的常见结构(若你的结构不同,可调整代码对应字段):
- df1:包含员工邮箱、直属上级邮箱(supervisor_email)、各层级经理邮箱(manager_01_email至manager_04_email,01为顶层)、季度字段(quarter)
- df_attr:包含邮箱(email)、季度(quarter)、attrition_rate(含NaN或缺失值)
实现步骤
构建高效查找映射
先把df_attr中有效(非NaN)的attrition_rate转成以(季度, 邮箱)为键的字典,减少后续查找耗时:import pandas as pd import numpy as np # 过滤NaN值,构建映射表 attr_map = df_attr.dropna(subset=['attrition_rate']).set_index(['quarter', 'email'])['attrition_rate'].to_dict()定义层级遍历填充函数
针对每一行数据,从直属上级开始向上遍历经理层级,返回第一个找到的有效attrition_rate:def fill_attrition(row): quarter = row['quarter'] # 按直属上级→上一级经理→顶层经理的顺序遍历,去重避免重复查找 hierarchy = list(dict.fromkeys([ row['supervisor_email'], row['manager_03_email'], row['manager_02_email'], row['manager_01_email'] ])) for email in hierarchy: key = (quarter, email) if key in attr_map: return attr_map[key] # 所有层级无有效数据时返回NaN,可按需修改为默认值 return np.nan应用函数填充数据
对df1逐行应用函数,生成填充后的字段:df1['filled_attrition_rate'] = df1.apply(fill_attrition, axis=1)
示例验证
用示例数据测试(可替换为你的真实数据):
# 示例df1 df1 = pd.DataFrame({ 'employee_email': ['emp1@test.com', 'emp2@test.com', 'emp3@test.com'], 'supervisor_email': ['mgr4@test.com', 'mgr4@test.com', 'mgr3@test.com'], 'manager_04_email': ['mgr4@test.com', 'mgr4@test.com', 'mgr3@test.com'], 'manager_03_email': ['mgr3@test.com', 'mgr3@test.com', 'mgr2@test.com'], 'manager_02_email': ['mgr2@test.com', 'mgr2@test.com', 'mgr1@test.com'], 'manager_01_email': ['mgr1@test.com', 'mgr1@test.com', 'mgr1@test.com'], 'quarter': ['Q2_2024', 'Q2_2024', 'Q2_2024'] }) # 示例df_attr df_attr = pd.DataFrame({ 'email': ['mgr4@test.com', 'mgr3@test.com', 'mgr2@test.com', 'mgr1@test.com'], 'quarter': ['Q2_2024', 'Q2_2024', 'Q2_2024', 'Q2_2024'], 'attrition_rate': [np.nan, np.nan, 0.12, 0.08] })
运行后df1的filled_attrition_rate列会分别返回0.12、0.12、0.08,符合向上遍历取最近有效数据的需求。
内容的提问来源于stack exchange,提问作者wjie08
相关产品推荐
相关产品推荐

