已知其他变量值,查找缺失的Boss_Position观测值
如何根据已知Boss_Name填充缺失的Boss_Position字段?
嘿,我明白你现在的需求——要从已有完整数据里匹配Boss_Name对应的职位,补全那些缺失的Boss_Position字段对吧?我给你几个不同工具下的实用方案,你可以根据自己常用的工具来选:
Excel/Google Sheets 操作方案
- 第一步:先做一份Boss_Name与Boss_Position的唯一映射表
把所有包含完整Boss_Name和Boss_Position的行(包括那些Boss自己作为Own_Name的行)提取出来,用「删除重复项」功能去重。如果同一个Boss在不同年份职位有变化,记得保留Boss_Name+Year的唯一组合,别直接去重掉年份维度。 - 第二步:用匹配函数补全缺失值
假设你的原始数据在A:D列(A=Own_Name, B=Own_Position, C=Year, D=Boss_Position),映射表放在F:G列(F=Boss_Name, G=Boss_Position),可以在D2单元格输入:
要是习惯用VLOOKUP,记得把映射表的Boss_Name放在第一列:=XLOOKUP(B2,$F:$F,$G:$G,"",0)
如果需要按年份匹配职位,就把映射表的F列改成=VLOOKUP(B2,$F:$G,2,FALSE)=F2&C2(Boss_Name拼接Year),公式里用=XLOOKUP(B2&C2,$F:$F,$G:$G,"",0)就行。
Python Pandas 代码方案
如果用Python处理批量数据,这个方法效率更高:
- 先读取数据集:
import pandas as pd df = pd.read_csv("your_data_file.csv") # 替换成你的数据路径 - 生成职位映射字典:
- 不考虑年份变化,取每个Boss的最新职位:
# 先过滤出有完整职位的行,按年份排序后取每个Boss的最后一条职位 boss_pos_map = df.dropna(subset=["Boss_Position"]).sort_values("Year").groupby("Boss_Name")["Boss_Position"].last().to_dict() - 需要按年份匹配的话:
# 用Boss_Name+Year作为键,职位作为值 boss_pos_map = df.dropna(subset=["Boss_Position"]).set_index(["Boss_Name", "Year"])["Boss_Position"].to_dict()
- 不考虑年份变化,取每个Boss的最新职位:
- 填充缺失值:
# 不考虑年份的情况 df["Boss_Position"] = df["Boss_Position"].fillna(df["Boss_Name"].map(boss_pos_map)) # 考虑年份的情况 df["Boss_Position"] = df["Boss_Position"].fillna(df.apply(lambda row: boss_pos_map.get((row["Boss_Name"], row["Year"])), axis=1))
SQL 数据库补全方案
如果数据存在数据库里,可以用自连接来批量更新:
WITH boss_valid_positions AS ( -- 先从数据里提取所有Boss的有效职位(包括他们作为Own_Name的行) SELECT DISTINCT Own_Name AS Boss_Name, Year, Own_Position AS Boss_Position FROM employee_hierarchy WHERE Own_Position IS NOT NULL ) UPDATE employee_hierarchy eh SET Boss_Position = bp.Boss_Position FROM boss_valid_positions bp WHERE eh.Boss_Name = bp.Boss_Name AND eh.Year = bp.Year AND eh.Boss_Position IS NULL;
注:不同SQL方言的语法会有差异,比如MySQL要用JOIN代替FROM,Oracle可以用MERGE语句,你根据自己用的数据库调整就行。
几个关键注意点
- 先清理映射数据:一定要确保每个
Boss_Name(或Boss_Name+Year)对应的职位是唯一的,如果出现同个Boss同一年有多个不同职位的冲突,得先确定取哪一个(比如最新记录、最高职级)。 - 验证结果:填充完后,记得检查还有没有遗漏的缺失值,那些可能是没有对应完整数据的Boss,需要单独核对处理。
内容的提问来源于stack exchange,提问作者Reliably Sourced
相关产品推荐
相关产品推荐

