根据条件从其他列中的最小日期插补日期值

Impute date value from minimum date in other column based on a condition

提问人:y R 提问时间:11/1/2023 最后编辑:petezurichy R 更新时间:11/1/2023 访问量:59

问:

我有一个数据集,比如,

划分 员工 加入日期 Obs 日期
DV1的 EMP1 01/01/1972 10/10/1996
Fvp的 EMP1 25/10/1989 24/05/1999
Dv1 EMP2的 02/02/1995
DV1的 EMP2的 05/02/1995
Fvp的 EMP2的 10/10/2000 20/05/2001

我想获取每个员工的最小 Obs 日期,其加入日期为 null。并替换它。 请注意,员工代码在各个部门之间是重复的。但是,部门和员工综合代表同一员工

输出需要是,

划分 员工 加入日期 Obs 日期
DV1的 EMP1 01/01/1972 10/10/1996
Fvp的 EMP1 25/10/1989 24/05/1999
Dv1 EMP2的 02/02/1995 02/02/1995
DV1的 EMP2的 02/02/1995 05/02/1995
Fvp的 EMP2的 10/10/2000 20/05/2001
Python Pandas DataFrame 数据科学

评论


答:

3赞 Umagon 11/1/2023 #1

我假设表中的“Dv1”和“DV1”是相同的值(否则,这个问题对我来说没有意义)。如果是这种情况,则必须在应用以下解决方案之前进行一些清洁。即:.如果需要,可以在之后恢复以前的值。df['Division'] = df['Division'].str.lower()

您可以使用:

df['Date of Join'] = df['Date of Join'].fillna(df.groupby(['Division','Employee'])['Obs Date'].transform("min"))

输出:

划分 员工 加入日期 Obs 日期
0 DV1的 EMP1 01/01/1972 10/10/1996
1 Fvp的 EMP1 25/10/1989 24/05/1999
2 DV1的 EMP2的 02/02/1995 02/02/1995
3 DV1的 EMP2的 02/02/1995 05/02/1995
4 Fvp的 EMP2的 10/10/2000 20/05/2001

这样做的目的是:

  • df['Date of Join']:分配列的所有值。
  • df['Date of Join'].fillna():获取列的值,但替换值。Null
  • df.groupby(['Division','Employee'])['Obs Date']:按键分组,让焦点在每组的列中。Obs Date
  • transform("min"):从我找到此解决方案的提示(https://stackoverflow.com/a/53339320/1311269):

+ 语法将分组均值映射到原始数据帧的索引。groupbytransform

希望对你有所帮助。