如何用Python/Pandas按条件用Obs Date最小值填充Date of Join空值?
使用Pandas填充员工入职日期空值的解决方案
需求说明
处理员工数据集时需遵循以下规则:
- 若
Date of Join为空值,用该员工对应的最小Obs Date填充 - 必须结合
Division和Employee共同标识员工(Employee代码会跨Division重复)
原始数据集
| Division | Employee | Date of Join | Obs Date |
|---|---|---|---|
| DV1 | Emp1 | 01/01/1972 | 10/10/1996 |
| Dv2 | Emp1 | 25/10/1989 | 24/05/1999 |
| Dv1 | Emp2 | Null | 02/02/1995 |
| DV1 | Emp2 | Null | 05/02/1995 |
| Dv2 | Emp2 | 10/10/2000 | 20/05/2001 |
期望输出
| Division | Employee | Date of Join | Obs Date |
|---|---|---|---|
| DV1 | Emp1 | 01/01/1972 | 10/10/1996 |
| Dv2 | Emp1 | 25/10/1989 | 24/05/1999 |
| Dv1 | Emp2 | 02/02/1995 | 02/02/1995 |
| DV1 | Emp2 | 02/02/1995 | 05/02/1995 |
| Dv2 | Emp2 | 10/10/2000 | 20/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)
关键步骤说明
- 日期类型转换:用
pd.to_datetime统一日期格式,同时将字符串Null转为Pandas可处理的NaN,避免后续计算出错。 - 分组计算最小日期:通过
groupby(['Division', 'Employee'])确保按真实员工个体分组,transform('min')方法会返回与原数据行数一致的结果,方便直接匹配填充。 - 空值填充:
fillna方法精准替换每组内的Date of Join空值,确保逻辑符合需求。
内容的提问来源于stack exchange,提问作者y R
相关产品推荐
相关产品推荐

