根据Pandas上的日期范围条件合并行并汇总



我有一个pandas数据框架,其中包括HR数据。对于每个人,都有一些记录,我想基于"VALID_FROM"列合并。每行应该由一个VALID_FROM和多个VALID_TO和CODE值组成。

下面是我正在做的一个例子:

ID      NAME   FAMILY  VALID_FROM   VALID_TO    CODE
000     Mike   Jones   2023-03-01   2260-01-01  115
000     Mike   Jones   2023-03-01   2260-01-01  102
000     Mike   Jones   2022-11-01   2023-02-28  102
000     Mike   Jones   2023-03-01   2260-01-01  101
000     Mike   Jones   2022-10-01   2022-10-31  102
000     Mike   Jones   2022-10-01   2022-10-31  115
000     Mike   Jones   2022-11-01   2023-02-28  115
000     Mike   Jones   2022-10-01   2023-02-28  101

这是我想要的:

ID      NAME   FAMILY  VALID_FROM_1   VALID_TO_1  CODE_1 VALID_TO_2  CODE_2 VALID_TO_3 CODE_3
000     Mike   Jones   2022-10-01     2022-10-31  102    2022-10-31  115    2023-02-28 101
000     Mike   Jones   2022-11-01     2023-02-28  102    2023-02-28  115    n/a        n/a
000     Mike   Jones   2023-03-01     2260-01-01  101    2260-01-01  102    2260-01-01 115
解决这个问题的最好方法是什么?我已经研究了groupby()函数,但我仍然不是很了解它。

您可以尝试使用df您的数据框架:

from itertools import chain
group = ["ID", "NAME", "FAMILY", "VALID_FROM"]
df = (
df
.sort_values(["VALID_FROM", "VALID_TO", "CODE"])
.assign(COUNT=lambda df: df.groupby(group).transform("cumcount") + 1)
.pivot(index=group, columns="COUNT")
)
df.columns = [f"{c}_{n}" for c, n in df.columns]
result = df[chain(*zip(df.columns[:3], df.columns[3:]))].reset_index()

您的样品结果:

ID  NAME FAMILY  VALID_FROM  VALID_TO_1  CODE_1  VALID_TO_2  CODE_2  
0   0  Mike  Jones  2022-10-01  2022-10-31   102.0  2022-10-31   115.0   
1   0  Mike  Jones  2022-11-01  2023-02-28   102.0  2023-02-28   115.0   
2   0  Mike  Jones  2023-03-01  2260-01-01   101.0  2260-01-01   102.0   
VALID_TO_3  CODE_3  
0  2023-02-28   101.0  
1         NaN     NaN  
2  2260-01-01   115.0

最新更新