You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于其他DataFrame数据替换生成指定结构的新DataFrame?

问题描述

现有三个Pandas DataFrame:

  1. shifts:存储各日期的值班人员姓名(部分值为NaN)
a    b    c
2023-01-01  Sam  Max  NaN
2023-01-02  Mia  NaN  Max
2023-01-03  NaN  Sam  Mia
  1. 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
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:02:57