Python Pandas:基于唯一员工ID条件更新多行缺失薪资值
问题:用备份数据填充主DataFrame的缺失薪资字段
问题场景
主DataFrame(df)里同一员工对应多行数据,薪资字段(Previous_sal、current_salary)存在缺失;另有备份CSV文件a_bkp.csv存着对应员工的完整薪资数据。之前用update方法更新时错误修改了无关员工的数据,需求是只填充主DataFrame中存在空值的员工行,用备份文件里对应Employee_id的数据补全。
主DataFrame示例
Employee_id Previous_sal current_salary 1 1 1 2 1000 1500
备份CSV(a_bkp.csv)示例
Employee_id Previous_sal current_salary 1 2000 3000
预期输出
Employee_id Previous_sal current_salary 1 2000 3000 1 2000 3000 1 2000 3000 2 1000 1500
错误代码(导致更新无关员工)
test2=pd.read_csv('./a_bkp.csv') emp.update(test2,join='left',overwrite=False)
正确解决方案
高效实现代码(推荐)
用向量化操作替代循环,适合大数据量场景,同时精准匹配员工ID填充空值:
import pandas as pd # 读取主数据和备份数据 df = pd.read_csv('你的主数据文件路径.csv') # 替换成实际路径 test2 = pd.read_csv('./a_bkp.csv') # 合并备份数据到主DataFrame,保留原字段和备份字段 merged_df = df.merge(test2, on='Employee_id', how='left', suffixes=('', '_bkp')) # 用备份值填充原字段的空值,不覆盖已有有效值 df['Previous_sal'] = df['Previous_sal'].fillna(merged_df['Previous_sal_bkp']) df['current_salary'] = df['current_salary'].fillna(merged_df['current_salary_bkp'])
逻辑说明
- 通过
merge按Employee_id关联主数据和备份数据,给备份字段加后缀区分; - 用
fillna只替换原字段的空值,已有有效值完全保留; - 全程只针对匹配到
Employee_id的行操作,不会影响无关员工的数据。
小数据集可选方案(逻辑直观)
如果数据量小,也可以用迭代行的方式实现:
import pandas as pd df = pd.read_csv('你的主数据文件路径.csv') test2 = pd.read_csv('./a_bkp.csv') # 把备份数据转成以Employee_id为键的字典,方便快速查找 salary_dict = test2.set_index('Employee_id')[['Previous_sal', 'current_salary']].to_dict('index') # 遍历主DataFrame,只填充空值行 for idx, row in df.iterrows(): emp_id = row['Employee_id'] # 只有当前行薪资字段为空,且备份里有该员工数据时才填充 if pd.isna(row['Previous_sal']) or pd.isna(row['current_salary']): if emp_id in salary_dict: df.at[idx, 'Previous_sal'] = salary_dict[emp_id]['Previous_sal'] df.at[idx, 'current_salary'] = salary_dict[emp_id]['current_salary']
内容的提问来源于stack exchange,提问作者technical
相关产品推荐
相关产品推荐

