如何基于其他DataFrame数据替换生成指定结构的新DataFrame?
问题描述
现有三个Pandas DataFrame:
shifts:存储各日期的值班人员姓名(部分值为NaN)
a b c 2023-01-01 Sam Max NaN 2023-01-02 Mia NaN Max 2023-01-03 NaN Sam Mia
performance:存储每位员工每日的绩效数据,行索引与shifts一致,列名为员工姓名
Sam Mia Max Ian 2023-01-01 4.5 NaN 3.0 NaN 2023-01-02 NaN 2.0 3.0 NaN 2023-01-03 4.0 3.0 NaN 4.0
salary:存储员工薪资,结构和索引与前两者不同
Employee Salary 0 Sam 100 1 Mia 90 2 Max 80 3 Ian 70
需要生成两个与shifts结构、索引完全一致的输出DataFrame:
- 输出1:将员工姓名替换为该员工当日的绩效数据
- 输出2:将员工姓名替换为该员工的薪资
预期输出如下:
Output 1: a b c 2023-01-01 4.5 3.0 NaN 2023-01-02 2.0 NaN 3.0 2023-01-03 NaN 4.0 3.0 Output 2: a b c 2023-01-01 100.0 80.0 NaN 2023-01-02 90.0 NaN 80.0 2023-01-03 NaN 100.0 90.0
解决方案
实现输出1(替换为当日绩效)
方法1:使用lookup方法
利用DataFrame.lookup按行索引(日期)和列值(员工名)匹配performance中的数据:
output1 = shifts.apply(lambda col: performance.lookup(shifts.index, col), axis=0)
方法2:堆叠后匹配再还原
将两个DataFrame转为堆叠格式,匹配后恢复原结构:
# 堆叠shifts和performance shift_stack = shifts.stack() perf_stack = performance.stack() # 匹配绩效后还原结构 output1 = shift_stack.map(perf_stack).unstack()
实现输出2(替换为员工薪资)
先将salary转换为员工名映射薪资的字典,再用replace直接替换:
# 生成员工-薪资字典 salary_map = salary.set_index('Employee')['Salary'].to_dict() # 替换shifts中的员工名为对应薪资 output2 = shifts.replace(salary_map)
内容的提问来源于stack exchange,提问作者younggotti
相关产品推荐
相关产品推荐

