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

如何用Python/Pandas按条件用Obs Date最小值填充Date of Join空值?

使用Pandas填充员工入职日期空值的解决方案

需求说明

处理员工数据集时需遵循以下规则:

  • 若Date of Join为空值,用该员工对应的最小Obs Date填充
  • 必须结合Division和Employee共同标识员工(Employee代码会跨Division重复)

原始数据集

DivisionEmployeeDate of JoinObs Date
DV1Emp101/01/197210/10/1996
Dv2Emp125/10/198924/05/1999
Dv1Emp2Null02/02/1995
DV1Emp2Null05/02/1995
Dv2Emp210/10/200020/05/2001

期望输出

DivisionEmployeeDate of JoinObs Date
DV1Emp101/01/197210/10/1996
Dv2Emp125/10/198924/05/1999
Dv1Emp202/02/199502/02/1995
DV1Emp202/02/199505/02/1995
Dv2Emp210/10/200020/05/2001

实现代码

import pandas as pd

# 构造原始数据集
data = {
    'Division': ['DV1', 'Dv2', 'Dv1', 'DV1', 'Dv2'],
    'Employee': ['Emp1', 'Emp1', 'Emp2', 'Emp2', 'Emp2'],
    'Date of Join': ['01/01/1972', '25/10/1989', 'Null', 'Null', '10/10/2000'],
    'Obs Date': ['10/10/1996', '24/05/1999', '02/02/1995', '05/02/1995', '20/05/2001']
}
df = pd.DataFrame(data)

# 将日期列转为datetime类型,同时把'Null'转为Pandas可识别的空值(NaN)
df['Date of Join'] = pd.to_datetime(df['Date of Join'], errors='coerce')
df['Obs Date'] = pd.to_datetime(df['Obs Date'], errors='coerce')

# 按Division+Employee分组,计算每组的最小Obs Date,保持原数据行数匹配
min_obs_date = df.groupby(['Division', 'Employee'])['Obs Date'].transform('min')

# 填充空值:用对应组的最小Obs Date替换Date of Join的NaN
df['Date of Join'] = df['Date of Join'].fillna(min_obs_date)

# 可选:将日期转回原字符串格式(根据需求调整)
df['Date of Join'] = df['Date of Join'].dt.strftime('%d/%m/%Y')
df['Obs Date'] = df['Obs Date'].dt.strftime('%d/%m/%Y')

# 输出结果
print(df)

关键步骤说明

  1. 日期类型转换:用pd.to_datetime统一日期格式,同时将字符串Null转为Pandas可处理的NaN,避免后续计算出错。
  2. 分组计算最小日期:通过groupby(['Division', 'Employee'])确保按真实员工个体分组,transform('min')方法会返回与原数据行数一致的结果,方便直接匹配填充。
  3. 空值填充:fillna方法精准替换每组内的Date of Join空值,确保逻辑符合需求。

内容的提问来源于stack exchange,提问作者y R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:47:34