如何基于dfB匹配职位与部门填充dfA缺失的薪资字段?
问题:用dfB填充dfA的缺失薪资值
我有两个形状、顺序均不同的DataFrame:dfA和dfB,dfA是dfB的子集。两表包含Job Title、Job Department、Job Salary三列,dfA的Job Salary存在缺失值,需要通过匹配dfB中相同Job Title+Job Department的记录填充薪资(同一组合薪资一致)。
我尝试了以下代码但未成功:
condition_A = (dfA['Job Title'] == dfB['Job Title']) condition_B = (dfA['Job Department'] == dfB['Job Department']) dfA.loc[(condition_A) & (condition_B), 'Job Salary'] = dfB.loc[(condition_A) & (condition_B), 'Job Salary']
示例数据
import pandas as pd import numpy as np dataA = { 'Job Title': ['ET', 'FT', 'ET', 'ST', 'ST'], 'Job Department': ['T', 'T', 'PT', 'T', 'PT'], 'Job Salary': [np.nan, 1500, 1000, np.nan, np.nan] } dfA = pd.DataFrame(dataA) dataB = { 'Job Title': ['ST', 'ET', 'RT', 'FT', 'ST', 'PT', 'ET'], 'Job Department': ['T', 'T', 'PT', 'T', 'PT', 'T', 'PT'], 'Job Salary': [2000, 800, 1700, 1500, 2500, 700, 1000] } dfB = pd.DataFrame(dataB)
期望结果
填充缺失值后的dfA:
dataA = { 'Job Title': ['ET', 'FT', 'ET', 'ST', 'ST'], 'Job Department': ['T', 'T', 'PT', 'T', 'PT'], 'Job Salary': [800, 1500, 1000, 2000, 2500] } dfA = pd.DataFrame(dataA)
问题原因
你之前的代码错误在于直接按行索引比较dfA和dfB的列值,但两者行数、顺序完全不同,这种逐行对比无法匹配到对应的Job Title+Job Department组合,导致填充失败。
解决方案
方法1:构建薪资映射字典
先从dfB中提取(职位, 部门)到薪资的唯一映射,再用这个映射填充dfA的缺失值:
# 构建职位+部门到薪资的映射字典 salary_map = dfB.set_index(['Job Title', 'Job Department'])['Job Salary'].to_dict() # 遍历dfA,填充缺失薪资 dfA['Job Salary'] = dfA.apply( lambda row: salary_map[(row['Job Title'], row['Job Department'])] if pd.isna(row['Job Salary']) else row['Job Salary'], axis=1 )
方法2:使用merge合并填充
通过merge将dfB的薪资匹配到dfA,再用fillna填充缺失值,代码更简洁:
# 合并dfA与dfB的薪资列,仅保留匹配的组合 merged_df = dfA.merge( dfB[['Job Title', 'Job Department', 'Job Salary']], on=['Job Title', 'Job Department'], suffixes=('', '_b'), how='left' ) # 填充缺失值 dfA['Job Salary'] = dfA['Job Salary'].fillna(merged_df['Job Salary_b'])
两种方法都能得到你期望的结果,其中方法2更符合pandas的惯用写法,效率也更高。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

